繁体   English   中英

QTimer每秒执行一次方法

[英]QTimer to execute method every second

我正在学习Qt,我正在阅读Qt wiki中关于Threads,Events和QObjects的内容,并遵循wiki建议如何在一段时间内处理某些工作,但它不适用于我的特定情况。 这是我目前正在努力实现的一个简单示例。

class FooEvents : public FooWrapper {

    public virtual serverTime(..) { std::cout << "Server time event\n"; }
    public virtual connected(..) { std::cout << "Connected event\n"; }
}

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

        }

    }

}

这很简单,但我认为这说明了我的情况。 为什么这不起作用以及我必须处理这种情况的其他替代方案? Thanks.s

编辑:每秒都会调用processMessages,但我没有从事件中获得任何输出

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();
  ...
};

然后记得建立SIGNAL-SLOT连接并配置计时器:

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);
  ...
};

然后你必须实现timer事件:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM