0

我想使用 Qt 框架创建一个程序。目的是编写一个程序,使用 QThread 来显示一个简单的数字时钟。但跑步时什么也没发生。

这是用于运行的 Qthread 的子类

支付计时器.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. connect正如hyde所指出的,您的陈述是错误的。该this参数是隐含的,因此您可以简单地说:

    connect(t, SIGNAL(mySignal(QString)), SLOT(now(QString)));
    
  3. 您不需要使用线程来发出定期时间更新。

MainWindow可能如下所示。它会注意尽可能接近整秒触发计时器事件。

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(t, SIGNAL(mySignal(QString)), this, SLOT(now(QString)));

要捕获此类问题,首先检查控制台输出,您应该会看到有关连接失败的警告。还有一点,使用Qt Creator自动补全SIGNALSLOT宏,因为很容易犯愚蠢的错误,编译器不会发现。

还有一些其他有趣的事情,例如子类中看似无用的额外QThread*成员变量QThread,以及不必要的互斥锁,但这些不应该阻止事情的工作。

一般来说,您似乎只是在学习 Qt。我会把线程留到以后,它们有很多小问题和细节,在学习 Qt 基础知识的同时担心它们不会让生活变得轻松。

于 2013-09-05T19:12:07.090 回答