Qt5不会发送超时信号

Qt5 won't send timeout signal

我是 QT5 的新手,我遇到了一个非常奇怪的问题。 我想用QTimer每0.5秒从串口设备读取一次坐标,但是QTimer不会发送超时信号。

我的.h:

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void test();

private:
    Ui::MainWindow *ui;
};

我的.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTimer myTimer(this);
    myTimer.setInterval(500);
    myTimer.setSingleShot(false);
    connect(&myTimer, SIGNAL(timeout()), this, SLOT(test()));
    myTimer.start();
}

void MainWindow::test() {
    qDebug() << "Time out";
}

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

我启动程序后,没有一个 "Time out" 出现...

我在"myTimer.start()"后面添加了以下代码:

QTime t = QTime::currentTime().addMSecs(550);
while (QTime::currentTime() < t) {
    qDebug() << myTimer.remainingTime();
}

而且我发现"myTimer"的剩余时间减到0后,不会重新填满剩余时间重新开始,一直是0。

Q_OBJECT 已添加

有人知道吗?

非常感谢!

问题出在这里:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTimer myTimer(this);
    myTimer.setInterval(500);
    myTimer.setSingleShot(false);
    connect(&myTimer, SIGNAL(timeout()), this, SLOT(test()));
    myTimer.start();
}

在构造函数中你自动声明了myTimer,所以它会在构造函数returns时被销毁。这样,当您期望超时事件时,myTimer 不再存在,因此它无法发送任何信号!

解决方案很简单:myTimer 应该一直存在 MainWindow 对象存在,所以在 class 中声明它,而不是在它的构造函数中,并动态分配它:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void test();

private:
    QTimer *myTimer; // <--- pointer declaration.
    Ui::MainWindow *ui;
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // Allocating actual QTimer object:
    myTimer = new QTimer(this);
    // Calling methods by object pointer:
    myTimer->setInterval(500);
    myTimer->setSingleShot(false);
    connect(myTimer, SIGNAL(timeout()), this, SLOT(test()));
    myTimer->start();
}

MainWindow::~MainWindow()
{
    // Don't forget to delete after usage.
    delete myTimer;
    delete ui;
}

myTimer 是本地的。

使其成为 class 成员并使用它。它会起作用。