我正在学习 Qt,我正在阅读 Qt wiki 中有关线程、事件和 QObject 的内容,并遵循了关于如何在一段时间内处理某些工作的 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
}
}
}
这很简单,但我认为它说明了我的情况。为什么这不起作用,还有什么其他替代方法可以处理这种情况?谢谢。
编辑:每秒调用 processMessages,但我没有从事件中获得任何输出
最佳答案
timer
在哪里声明和定义?
如果它在 Foo::connect()
本地,它将在它有机会触发之前被销毁。大概它只需要是 Foo
类的成员对象即可。
另外请记住,QObject
为计时器提供了它自己的简单接口(interface) - 只需覆盖 protected 虚拟 timerEvent()
函数并调用 QObject 的 startTimer()
开始获取那些计时器事件。在这种情况下,它们不会有一个插槽来接收计时器事件,它们只会在重写的 timerEvent()
函数处结束:
protected:
void timerEvent(QTimerEvent *event) {
processMessages();
}
public:
void connect( /* ... */ ) {
// ...
startTimer(1000);
}
关于c++ - QTimer每秒执行一次方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10667689/