QTimer 每秒执行一次方法
QTimer to execute method every second
我正在学习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);
相关文章:
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 访问随机图像像素的快速方法,最多一次
- 只设置一次方法中变量的值
- cppUnit:针对多个测试方法执行一次的设置函数
- 是否有一种方法可以在运行时停止循环重复一次不止一次
- 快速简单的方法,以C++为单位一次读取一个字节的 stdin
- 最简单的方法使多个指针一次指向同一位置,一次只处理2个位置
- C++菱形问题 - 如何仅调用一次基方法
- 搜索字符串是否至少包含一次从 0 到 9 的所有数字的最有效方法
- 当Bool值在UPDATE()方法中更改时,只有一次呼叫函数
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 有没有一种优雅的方法,根据用户输入只决定一次
- 如何确保方法在该对象的生存期内仅执行一次?
- 在方法中构造一个std:映射一次
- 只为NOT STATIC类的EACH对象调用一次方法
- 在继承层次结构中将方法定义为虚拟方法一次,以使多态性发挥作用
- C++将节点添加到链表的开头一次后失败.其他方法也有问题
- QTimer 每秒执行一次方法
- 如何只执行一次方法代码,尽管每帧调用一次
- 从类中只调用一次方法