我正在尝试更新QProgressDialog(由QMainWindow类拥有)沿着执行一些耗时操作的QThread.线程在操作期间发出一些信号,以通知调用应用程序有关进展.我正在寻找将线程发出的进度信号连接到QProgressDialog的setValue槽以更新进度条.
它不起作用!不显示进度对话框.如果我在QMainWindow中添加一个插槽并将其连接到工作进度信号以显示线程通过qDebug输出给出的值,我看到信号似乎在线程操作期间被堆叠并且仅在结束时被取消堆叠.线.
我尝试过DirectConnection connect选项但没有成功.
这是我的代码:qapp.cpp
#include "qapp.h"
#include <threaded.h>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDebug>
#include <QProgressDialog>
QApp::QApp(QWidget *parent) :
QMainWindow(parent)
{
QVBoxLayout *mainLayout = new QVBoxLayout(this);
QWidget *window = new QWidget(this);
window->setLayout(mainLayout);
setCentralWidget(window);
QPushButton *button = new QPushButton("Run");
mainLayout->addWidget(button);
connect(button, SIGNAL(clicked(bool)), this, SLOT(doSomeWork()));
}
void QApp::doSomeWork()
{
qDebug() << "do some work";
Threaded worker;
worker.doHeavyCaclulations();
QProgressDialog progressDialog("Copying files...", "Abort Copy", 0, 10000, this);
progressDialog.setWindowModality(Qt::WindowModal);
progressDialog.setMinimumDuration(0);
progressDialog.setValue(0);
connect(&worker, SIGNAL(progress(int)), &progressDialog, SLOT(setValue(int)));
connect(&worker, SIGNAL(progress(int)), this, SLOT(displayProgress(int)));
worker.wait();
qDebug() << "end of …Run Code Online (Sandbox Code Playgroud) 我找不到将鼠标事件附加到场景的方法。如果没有 View,所有事件都会被捕获,但是当注释掉时,只有 mousePressEvent 起作用。请帮忙。
from PySide import QtGui, QtCore
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.Scene()
self.View()
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
print "Pressed!!!"
def mouseMoveEvent(self, event):
print "moving....."
def mouseReleaseEvent(self, event):
print "-------released"
def Scene(self):
self.s = QtGui.QGraphicsScene(self)
def View(self):
self.v = QtGui.QGraphicsView(self.s)
self.setCentralWidget(self.v)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(300, 200)
window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud) 我有一个以下的情况.
Socket主for循环中创建了2个对象(原始问题有1000个对象).在创建时,start()调用该方法.start()创建一个QTcpSocket尝试连接到某个主机的.Socket有插槽connected()从QTcpSocket 捕获信号并打印一些调试输出所发生的事情是按时间顺序首先Socket创建所有对象,然后启动套接字.以下是调试选项的示例输出:
1. Created Socket object 1
2. Invoked Socket object 1 start()
3. Created Socket object 2
4. Invoked Socket object 2 start()
5. Socket object 1 TcpSocket Connected
6. Socket object 2 TcpSocket Connected
Run Code Online (Sandbox Code Playgroud)
码:
//main.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
for (int i=0; i<10; i++)
{
Socket *socket = new Socket();
qDebug() << "Socket …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用QsignalMapper在完成的SIGNAL上将我的String传递给img_loaded函数。但是我没有任何结果,请帮忙。
QString mystring = "value";
QNetworkAccessManager *m_netwManager = new QNetworkAccessManager(this);
QUrl url("http://images.gs-cdn.net/static/albums/80_9299765.jpg");
QNetworkRequest request(url);
connect(m_netwManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(img_loaded(QNetworkReply*)));
void MainWindow::img_loaded(QNetworkReply *rep){
//Handle my String here
}
Run Code Online (Sandbox Code Playgroud) 假设这timer是一个对象QTimer,定时器的间隔是iInterval和定时器的超时信号连接到一个插槽sltTimeout().
我只是在想如果iInterval小于sltTimeout()运行时间会发生什么.结果会运行多个线程sltTimeout()吗?如果是这样,似乎可能导致对对象的非同步访问出现问题.
任何人都可以澄清一下吗?
我在下面提出了一个简单的信号/插槽机制.当通过QSlider :: valueChanged()更改值时,QSlider将调用该信号.并通过QLCDNumber :: display()方法调用插槽.
令我困惑的是,为什么PyQt5的文档很少,而且大多数文档都会导致Qt5的链接.我对代码的具体问题是:
1)如果QSlider :: valueChanged()(signal)期望一个整数作为参数,为什么我们只传入QLCDNumber :: display()(slot)这是一个void函数.因此,没有任何东西可以通过.
2)在下面注释掉的代码中,我无法拨打第二个插槽.您可以为1个信号调用的插槽数量是否有限制?如果我如何在PyQt5中调用多个插槽.
编辑:我相信因为printLabel()不是一个定义的插槽,这就是我遇到问题的原因.我可以在:: connect()参数中包含任意数量的插槽吗?或者我是以黑客的方式接近这个.
import sys
from PyQt5.QtCore import (Qt)
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
QVBoxLayout, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def printLabel(self, str):
print(str)
def initUI(self):
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
#This line works
sld.valueChanged.connect(lcd.display)
#This line does not work
#sld.valueChanged.connect(lcd.display, self.printLabel("hi"))
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Signal & slot')
self.show()
if __name__ == '__main__': …Run Code Online (Sandbox Code Playgroud) 我的代码如下所示:
connect(c_name, SIGNAL(stateChanged(int) ), employeesList, SLOT(changeVisibility(int)));
Run Code Online (Sandbox Code Playgroud)
哪里c_name是 a QCheckBox,我想将其连接stateChange到属性的可见性 in employeesList,该方法如下所示:
void changeVisibility(int prop, int visibility){
if(prop & EmployeeListElement::Name)
updateVisibility(&EmployeeListElement::name, visibility);
if(prop & EmployeeListElement::Surname)
updateVisibility(&EmployeeListElement::surname, visibility);
if(prop & EmployeeListElement::DateOfBirth)
updateVisibility(&EmployeeListElement::date_of_birth, visibility);
if(prop & EmployeeListElement::DateOfEmployment)
updateVisibility(&EmployeeListElement::date_of_empl, visibility);
}
private:
void updateVisibility(QLabel* EmployeeListElement::* elem, int visibility){
visibility ? (this->*elem)->show() : (this->*elem)->hide();
}
...
Run Code Online (Sandbox Code Playgroud)
如您所见,我需要传递第二个参数,即我所指的属性,所以我想做这样的事情:
connect(c_name, SIGNAL(stateChanged(int) ), employeesList, SLOT(changeVisibility(int, Class::first_enum_property)));
Run Code Online (Sandbox Code Playgroud)
那不起作用,我的问题是,有没有办法做到这一点?也许不使用SIGNAL和SLOT指令并使用一些(也许)lambdas?