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

mfa*_*ani 1 c++ qt qt5

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

Rei*_*ica 5

  1. 你忘记添加Q_OBJECTMyClass,
  2. 您正在on_timeout.
  3. 您正在多次设置计时器的间隔。
  4. 您多次连接到计时器的信号。
  5. 您正在on_timeout公开实现细节(插槽)。
  6. 您通过手动管理QTimer.
  7. 你包括<QTimer>两次。
  8. 现在是 2016 年,您没有使用 C++11。是的,您甚至可以在 Qt 4 中使用它。

这是我写的方式:

Qt 5

#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)

Qt 4

在这里,我演示了实现细节应该是私有的。你当然可以像上面那样做并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)