信号没有从另一个线程调用槽

Posted

技术标签:

【中文标题】信号没有从另一个线程调用槽【英文标题】:Signal is not calling slot from another thread 【发布时间】:2016-08-02 07:35:16 【问题描述】:

我正在尝试使用以下方法从另一个线程更新 gui:https://***.com/a/14546167/2236297

这是我的工作线程:

class WorkerThread : public QThread 
    void run() 
        while(1) 

            //QTcpSocket messenger;
            //messenger.connectToHost("192.168.1.20", 61000);
            //if(!messenger.waitForConnected(3000))
            //
                emit progressChanged("111");
            //
        
    
    // Define signal:
    signals:
    void progressChanged(QString q)
    

    
;

唯一的区别是我将这个类声明为一个内部类并定义了progressChanged。在他的示例中,信号只是声明了,没有定义。

我的 onProgressChanged:

void ApplicationController::onProgressChanged(QString info) 

    // Processing code
    ui.label_2->setText("Latest info: " + info);

这就是我在构造函数中启动线程的方式:

ApplicationController::ApplicationController(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)

    ui.setupUi(this);

     WorkerThread *workerThread = new WorkerThread;
    // Connect our signal and slot
    connect(workerThread, SIGNAL(progressChanged(QString)),
                          SLOT(onProgressChanged(QString)));
    // Setup callback for cleanup when it finishes
     connect(workerThread, SIGNAL(finished()),
             workerThread, SLOT(deleteLater()));
    // Run, Forest, run!
    workerThread->start(); // This invokes WorkerThread::run in a new thread


问题是:为什么我的插槽没有被调用。我应该改变什么?

编辑

改变了工作线程。

.h 文件

class WorkerThread : public QThread
    
        Q_OBJECT

    public:
        WorkerThread();
        ~WorkerThread();
        void run();

    private:

    signals:
        void progressChanged(QString info);
    ;

.cpp 文件

WorkerThread::WorkerThread()  
WorkerThread::~WorkerThread()  

void WorkerThread::run()

    while(1) 
        QTcpSocket messenger;
        messenger.connectToHost("192.168.1.20", 61000);
        if(!messenger.waitForConnected(3000))
        
            emit progressChanged((QString("%1").arg(messenger.error())));
        
    

在调试中,发射有效。但是在 main 函数中没有调用 slot。

【问题讨论】:

问题是…… 您已经定义了信号的主体,而信号只应被声明(定义由 moc 有效生成)。您还缺少类定义中的 Q_OBJECT 宏。看看docs.。另请注意,在嵌套类中声明信号曾经存在问题——不确定是否仍然存在。 我已按照您的建议更改了 workerThread。仍然没有变化。 ***.com/a/26422155/1421332 【参考方案1】:

已解决

有多个错误:

首先应将workerThread定义为单独的类而不是内部类。

slot 应该在 slot 下声明:

公共插槽: void onProgressChanged(QString info);

【讨论】:

以上是关于信号没有从另一个线程调用槽的主要内容,如果未能解决你的问题,请参考以下文章

无法从其他线程播放 QMediaPlayer

有啥好方法可以快速触发 Qt 中的信号槽吗?

Qt信号槽原理(调用)

未调用 Qt 信号槽

QT中的信号与事件,多线程

QMetaObject::invokeMethod 不调用槽