标签: qt-signals

Qt 5:通过信号在QThread工作期间更新QProgressBar

我正在尝试更新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)

c++ qt multithreading qt-signals qt5

1
推荐指数
1
解决办法
7632
查看次数

Pyside QgraphicsScene无法捕获鼠标事件

我找不到将鼠标事件附加到场景的方法。如果没有 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)

qt pyqt pyside qt-events qt-signals

0
推荐指数
1
解决办法
2102
查看次数

Qt信号和插槽机制被主循环阻塞

我有一个以下的情况.

  • Socketfor循环中创建了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)

qt event-loop signals-slots qt-signals

0
推荐指数
1
解决办法
1232
查看次数

使用QNetWorkAccessManager将值传递到插槽

我正在尝试使用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)

qt qt-signals

0
推荐指数
1
解决办法
934
查看次数

QTimer的机制

假设这timer是一个对象QTimer,定时器的间隔是iInterval和定时器的超时信号连接到一个插槽sltTimeout().

我只是在想如果iInterval小于sltTimeout()运行时间会发生什么.结果会运行多个线程sltTimeout()吗?如果是这样,似乎可能导致对对象的非同步访问出现问题.

任何人都可以澄清一下吗?

c++ qt qt-signals qtimer qtcore

0
推荐指数
1
解决办法
264
查看次数

PyQt5一个信号和多个插槽

我在下面提出了一个简单的信号/插槽机制.当通过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)

qt pyqt qt-signals pyqt5

0
推荐指数
1
解决办法
1047
查看次数

Qt 将静态参数添加到连接指令

我的代码如下所示:

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)

那不起作用,我的问题是,有没有办法做到这一点?也许不使用SIGNALSLOT指令并使用一些(也许)lambdas?

c++ qt qt-signals

0
推荐指数
1
解决办法
38
查看次数