2016-08-02 73 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信息);