1

シグナルとスロットに問題があり、追加のスレッドであるバックグラウンド ワーカーを使用したいと考えています。メインGUIで更新する必要があるいくつかのdouble値を持つシグナルを送信することを想定しています。コードはコンパイルされ、スレッドも開始されますが、GUI は値を更新していません。

最初の gui スロット:

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 ステートメント:

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())); 
4

1 に答える 1

1

シグナルを送信するオブジェクトとレシーバー オブジェクトが異なるスレッドにある場合は、それをQt::QueuedConnection(ドキュメントはこちら)に接続する必要があります。

したがって、これに接続する変更:

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マクロがあったシグナルスロットを持つことが不可欠です

于 2013-08-07T23:59:38.060 に答える