0

Qt フレームワークを使用してプログラムを作成したいと考えています。目的は、QThread を使用して単純なデジタル時計を表示するプログラムを作成することです。しかし、実行中は何も起こりませんでした。

これは、実行するための Qthread のサブクラスです。

paytamtimers.h

#ifndef PAYTAMTIMERS_H
#define PAYTAMTIMERS_H
#include <QThread>

class PaytamTimers:public QThread
{
    Q_OBJECT
public:
    PaytamTimers();
QString now;
protected:
    virtual void run();
private:
    QMutex mutex;
    QThread *thread;

signals:
    void mySignal(QString);
};

#endif // PAYTAMTIMERS_H

これは this.class paytamtimers.cpp の実装です

#include "paytamtimers.h"
#include <QTime>

PaytamTimers::PaytamTimers()
{
    this->now="";
    this->thread=new QThread(0);
}

void PaytamTimers::run(){
forever{
    mutex.lock();
    this->now=QTime::currentTime().toString();
    this->thread->sleep(1000);
    emit mySignal(this->now);
    mutex.unlock();

}
}

これは GUI フォームの実装です。これは、簡単にするために、QLabel と paytamtimers のインスタンスで構成されています。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "paytamtimers.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    t=new PaytamTimers();
    t->start();
    connect(t,SIGNAL(t->mySignal(QString)),this,SLOT(this->now(const QString &string)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::now(const QString &string){
    this->ui->label->setText(t->now);
}
4

2 に答える 2

1
  1. スレッドでスリープしている間はミューテックスを保持しないでください。実際、ミューテックスは完全に不要です。

  2. hydeが指摘したように、あなたのconnect発言は間違っています。パラメータは暗示されているため、次のように簡単に言えます。this

    connect(t, SIGNAL(mySignal(QString)), SLOT(now(QString)));
    
  3. 定期的な時刻更新を発行するためにスレッドを使用する必要はありません。

以下MainWindowのようになります。タイマー イベントは、できるだけ 1 秒近く発生するように注意してください。

class MainWindow : public QWidget {
    Q_OBJECT
    QBasicTimer m_timer;
    void timerEvent(QTimerEvent * ev) {
        if (ev->timerId() == m_timer.timerId()) {
            QTime t = QTime::currentTime();
            m_timer.start(1000 - t.msec(), this);
            // round to nearest second
            if (t.msec() < 500) t = t.addMsecs(-t.msec()); else t = t.addMSecs(1000-t.msec());
            now(t.toString());
        }
    }
    void now(const QString &);
    ...
public:
    MainWindow(QWidget *parent = 0) : QWidget(parent) {
        m_timer.start(1000 - QTime::currentTime().msec(), this);
    }
};
于 2013-09-05T19:13:07.273 に答える
0

connect ステートメントが間違っています。次のようにする必要があります。

connect(t, SIGNAL(mySignal(QString)), this, SLOT(now(QString)));

このような問題を検出するには、まずコンソール出力を確認します。接続の失敗に関する警告が表示されるはずです。もう 1 つは、Qt Creator のオートコンプリートを使用して入力SIGNALSLOTマクロを作成することです。これは、愚かな間違いを犯しやすく、コンパイラによって発見されないためです。

QThread*サブクラスの一見役に立たない余分なメンバー変数QThreadや不要なミューテックスなど、他にもいくつか面白いことがありますが、これらは動作を停止するものではありません。

一般的に、あなたは Qt を学んでいるようです。後でスレッドを残しておきますが、それらには多くの小さな問題や詳細があり、Qt の基本を学びながらそれらについて心配することは、人生を楽にするものではありません。

于 2013-09-05T19:12:07.090 に答える