我正在使用Qt 5.7,我正在尝试在名为MyClass的类中使用带有超时事件的计时器。我在我的项目中添加了这个类。我在mainwindow.h中创建了这个类的公共变量。我把计时器的插槽连接到MyClass的构造函数中。我在MyClass中也有一个函数来启动计时器。但是当我执行该功能时,定时器插槽不起作用。 我在构建时没有错误,但是我在运行时在应用程序窗口中收到以下注释: QObject :: connect:没有这样的插槽QObject :: on_timeout()
这是我的代码:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "myclass.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MyClass mc;
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myclass.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
mc.TimerStart();
}
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QTimer>
class MyClass : public QObject
{
public:
MyClass();
TimerStart();
QTimer *timer;
public slots:
on_timeout();
};
#endif // MYCLASS_H
myclass.cpp
#include "myclass.h"
#include <QMessageBox>
#include <QTimer>
MyClass::MyClass()
{
timer = new QTimer(this);
}
MyClass::TimerStart()
{
timer->setInterval(1000);
connect(timer, SIGNAL(timeout()), this, SLOT(on_timeout()));
timer->start(1000);
}
MyClass::on_timeout()
{
QMessageBox msg;
msg.setText("updated");
msg.exec();
}
答案 0 :(得分:3)
您忘记在班级声明中添加Q_OBJECT
:
class MyClass : public QObject
{
Q_OBJECT
// ...
如果您使用的是Qt 5.7,则应使用Qt5语法进行连接:
connect(timer, &QTimer::timeout, this, &MyClass::on_timeout);
通过这样做,将在编译时而不是运行时评估连接。此外,您可以将信号连接到函数,即使它们未被声明为槽(因此您在类声明中不需要Q_OBJECT
标识符)。
更多信息here。
答案 1 :(得分:3)
Solve
添加到Q_OBJECT
,MyClass
重新进入事件循环。on_timeout
广告牌)公开。on_timeout
的内存来使代码失望。QTimer
两次。以下是我的写作方式:
<QTimer>
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QTimer>
#include <QMessageBox>
class MyClass : public QObject
{
Q_OBJECT
QMessageBox msg;
QTimer timer{this};
public:
explicit MyClass(QObject * parent = nullptr);
void timerStart();
};
#endif // MYCLASS_H
这里我演示了实现细节应该是私有的。您当然可以按上述方式执行操作,并在构造函数中设置#include "myclass.h"
MyClass::MyClass(QObject * parent) : QObject{parent}
{
msg.setText(QStringLiteral("updated"));
connect(&timer, &QTimer::timeout, &msg, &QMessageBox::show);
}
void MyClass::timerStart()
{
timer.start(1000);
}
的文本,并直接连接到msg
msg
。
SLOT(show())
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QTimer>
#include <QMessageBox>
class MyClass : public QObject
{
Q_OBJECT
QMessageBox msg;
QTimer timer{this};
Q_SLOT void on_timeout();
public:
explicit MyClass(QObject * parent = nullptr);
void timerStart();
};
#endif // MYCLASS_H