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 成员并使用它。它会起作用。
我是 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 成员并使用它。它会起作用。