QTimer 每秒执行一次方法

QTimer to execute method every second

本文关键字:一次 方法 执行 QTimer      更新时间:2023-10-16

我正在学习Qt,我正在从Qt wiki上阅读有关线程,事件和QObjects的信息,并遵循了wiki关于如何在一段时间内处理某些工作的建议,但它不适用于我的具体情况。这是我目前正在尝试实现的目标的简单示例。

class FooEvents : public FooWrapper {
    public virtual serverTime(..) { std::cout << "Server time eventn"; }
    public virtual connected(..) { std::cout << "Connected eventn"; }
}
class Foo : public QObject {
private:
    FooAPI *client;
public:

    Foo(FooEvents *ev, QObject *parent = 0) : client(new FooApi(ev)) { .. }
private slots:
    void processMessages() {
        if (state is IDLE)              
            reqFooAPiServerTime();
        select(client->fd()+1, ...);
        if (socket is ready for read)
            client.onReceive();
    }
public:
    void connect(...) {
        if (connection) {
            QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(processMessages()));
            timer.start(1000);  // I don't get the output from FooEvents
        }
    }
}

这是一个非常简单的,但我认为它说明了我的情况。为什么这不起作用,我还有什么其他选择来处理这种情况?谢谢

编辑:每秒调用一次进程消息,但我没有从事件中获得任何输出

在哪里

声明和定义timer

如果它是本地的Foo::connect(),它将在有机会开火之前被摧毁。 据推测,它只需要是Foo类的成员对象。

还要记住,QObject为计时器提供了自己的简单接口 - 只需覆盖受保护的虚拟timerEvent()函数并调用 QObject 的startTimer()即可开始获取这些计时器事件。在这种情况下,它们将最终出现在被覆盖的timerEvent()函数中,而不是有一个插槽来接收计时器事件:

protected:
    void timerEvent(QTimerEvent *event) {
        processMessages();
    }
public:
    void connect( /* ... */ ) {
            // ... 
            startTimer(1000);
    }

这是行不通的,因为 processMessages(( 不是SLOT

 So Declare processMessages() as a private slot and then try.

您既不声明计时器,也不声明插槽。在标头中,您必须声明:

class ... {
  QTimer timer;
  ...
private slots:
  void processMessages();
  ...
};

然后记得进行信号插槽连接并配置计时器:

connect(&timer, SIGNAL(timeout()), this, SLOT(processMessages()));
timer.setInterval(1000);
timer.start();

timer.start(1000);也是有效的...

另一种可能性

另一种可能性是使用与每个Q_OBJECT关联的计时器并重载timerEvent

class ... {
  Q_OBJECT
  ...
protected:
  void timerEvent(QTimerEvent *event);
  ...
};

然后,必须按如下所示实现计时器事件:

void MyClass::timerEvent(QTimerEvent *event) {
  processMessages();
}

您可以通过简单的调用来配置计时器startTimer(1000);