-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())));
}
}
}
在調試,發出作品。但是在主函數中沒有調用槽。
而問題是...... –
你已經定義了你的信號的主體,而信號只應該被聲明(該定義是由moc有效生成的)。你也缺少類定義中的'Q_OBJECT'宏。看看[docs。](http://doc.qt.io/qt-5/signalsandslots.html)。還要注意,曾經存在嵌套類聲明信號的問題 - 不確定是否仍然成立。 –
我按照你的建議改變了workerThread。仍然沒有變化。 – mucisk