2016-08-02 63 views
-1

我想用它来更新从另一个线程图形用户界面调用插槽:https://stackoverflow.com/a/14546167/2236297信号不是从另一个线程

这是我的WorkerThread:

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 

} 

问题是:为什么我的插槽不叫。我应该改变什么?

编辑

更改的WorkerThread。

.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()))); 
     } 
    } 
} 

在调试,发出作品。但是在主函数中没有调用槽。

+1

而问题是...... –

+1

你已经定义了你的信号的主体,而信号只应该被声明(该定义是由moc有效生成的)。你也缺少类定义中的'Q_OBJECT'宏。看看[docs。](http://doc.qt.io/qt-5/signalsandslots.html)。还要注意,曾经存在嵌套类声明信号的问题 - 不确定是否仍然成立。 –

+0

我按照你的建议改变了workerThread。仍然没有变化。 – mucisk

回答

0

解决

有多个错误:

  • 所有的WorkerThread首先应该被定义为独立的类不是一个内部类。

  • 插槽应在插槽声明:

    公共插槽: 无效onProgressChanged(即QString信息);

相关问题