2013-08-07 176 views
1

我有一個問題,我的信號和插槽,我想使用一個額外的線程backgroundworker。它假設發送一個帶有幾個雙值的信號,然後在主GUI中更新。那麼代碼編譯和線程也啓動,但gui沒有更新值。Qt信號和插槽問題

第一圖形用戶界面槽:

void MainWindow::slot_set_values(double ptm_temp, double ptm_hv, double heat_temp, double nomtemp, double current, double voltage) 
{ 
    ui->pmtValueLabel->setText(QString::number(ptm_temp)); 
    ui->hvValueLabel->setText(QString::number(ptm_hv)); 
    ui->heatValueLabel->setText(QString::number(heat_temp)); 
    ui->nomValueLabel->setText(QString::number(nomtemp)); 
    ui->currenValueLabel->setText(QString::number(current)); 
    ui->vValueLabel->setText(QString::number(voltage)); 

} 

工人代碼:

void dworker::run() 
{ 
    qsrand(QDateTime::currentDateTime().toTime_t()); 
    mData.set_pmt_temp(qrand()%100); 
    mData.set_pmt_hv(qrand()%100); 
    mData.set_heat_opt_temp(qrand()%100); 
    mData.set_heat_nominal_temp(qrand()%100); 

    for (int i = 0; i<100; i++) 
    { 
     double pmt_tmp = mData.get_pmt_temp(); 
     double hv = mData.get_pmt_hv(); 
     double heat_temp = mData.get_heat_opt_temp(); 
     double heat_nom = mData.get_heat_nominal_temp(); 

     emit set_values(pmt_tmp,hv,heat_temp,heat_nom,0,0); 
     emit set_pmt(); 

     QThread::msleep(1000); 
     qDebug() << "Test vom Thread " << i; 
    } 
} 

和連接語句:

connect(workerthread,SIGNAL(set_values(double,double,double,double,double,double)), 
this,SLOT(slot_set_values(double,double,double,double,double,double))); 

connect(workerthread,SIGNAL(set_pmt()),this,SLOT(slot_set_pmt())); 
+0

http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-解釋/ – Huy

+2

Wha t是dWorker類嗎?它是你派生出來的類嗎?如果是的話,你是否記得包含Q_OBJECT宏?另外,在調試器中運行時,通過連接線時會得到什麼輸出?如果有問題,它會告訴你那裏。 – TheDarkKnight

+0

您是否曾嘗試在您的插槽中添加qDebug語句以查看它是否被調用? – dunc123

回答

1

如果發送信號和接收器對象的對象是在一個不同的線程,你應該連接它Qt::QueuedConnection(文檔here

因此,改變你連接到這一點:

connect(workerthread,SIGNAL(set_values(double,double,double,double,double,double)), this,SLOT(slot_set_values(double,double,double,double,double,double)),Qt::QueuedConnection); 
connect(workerthread,SIGNAL(set_pmt()),this,SLOT(slot_set_pmt()),Qt::QueuedConnection); 

此外,還可以嘗試通過qDebug檢查,你這是在插槽接受:

qDebug()<<"my slot is called,"<<ptm_temp<<" "<<ptm_hv<<" "<<heat_temp<<" "<<nomtemp<<" "<<current<<" "<<voltage; 

同時,當務之急是要有信號插槽,在你的派生類的標題是Q_OBJECT