Qt5不会发送超时信号

时间:2016-08-19 02:31:34

标签: c++ qt5 qtimer

我是QT5的新手,我有一个非常奇怪的问题。 我想每隔0.5秒使用QTimer从串口设备读取坐标,但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;
}

在我启动程序后,没有一个&#34;超时&#34;出现......

我在&#34; myTimer.start()&#34;之后添加了以下代码:

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

我发现在&#34; myTimer&#34;的剩余时间之后减少到0,它不会重新填充剩余时间并再次开始,它保持为0。

已添加Q_OBJECT

有人有个主意吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

问题在于:

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,因此一旦构造函数返回它就会被销毁。这样,到预期超时事件时,myTimer不再存在,因此无法发送任何信号!

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

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;
}

答案 1 :(得分:0)

myTimer是本地的。

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