在项目的另一个类中使用QTimer及其超时事件

时间:2016-08-29 11:56:40

标签: c++ qt qt5

我正在使用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();
}

2 个答案:

答案 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)

  1. 您忘了将Solve添加到Q_OBJECT
  2. 您正在MyClass重新进入事件循环。
  3. 您多次设置计时器的间隔。
  4. 您多次连接到计时器的信号。
  5. 您正在制作实施细节(on_timeout广告牌)公开。
  6. 您通过手动管理on_timeout的内存来使代码失望。
  7. 您包括QTimer两次。
  8. 2016年,您还没有使用C ++ 11。是的,即使使用Qt 4也可以使用它。
  9. 以下是我的写作方式:

    Qt 5

    <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
    

    Qt 4

    这里我演示了实现细节应该是私有的。您当然可以按上述方式执行操作,并在构造函数中设置#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