我正在使用 Qt 5.7,并且我正在尝试在名为 MyClass 的类中使用带有超时事件的计时器。我在我的项目中添加了这个类。我在 mainwindow.h 中创建了这个类的公共变量。我将计时器的插槽连接放在 MyClass 的构造函数中。我在 MyClass 中还有一个函数来启动计时器。但是当我执行该函数时,定时器槽不起作用。我在构建时没有错误,但我在运行时在应用程序窗口上得到以下评论: QObject::connect: No such slot QObject::on_timeout()
这是我的代码:
主窗口.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
Run Code Online (Sandbox Code Playgroud)
主窗口.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();
}
Run Code Online (Sandbox Code Playgroud)
我的类.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
Run Code Online (Sandbox Code Playgroud)
我的类.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();
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
#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);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我演示了实现细节应该是私有的。你当然可以像上面那样做并msg在构造函数中设置's 文本,然后直接连接到msg's 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
Run Code Online (Sandbox Code Playgroud)
#include "myclass.h"
MyClass::MyClass(QObject * parent) : QObject{parent}
{
connect(&timer, SIGNAL(timeout()), SLOT(on_timeout()));
}
void MyClass::timerStart()
{
timer.start(1000);
}
void MyClass::on_timeout()
{
msg.setText("updated");
msg.show();
}
Run Code Online (Sandbox Code Playgroud)