我是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
有人有个主意吗?
非常感谢!
答案 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是本地的。
使其成为类成员并使用它。它会起作用。