1

我正在学习 Qt,并且正在从 Qt wiki 阅读有关线程、事件和 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

        }

    }

}

这是一个非常简单的问题,但我认为它说明了我的情况。为什么这不起作用以及我必须处理这种情况的其他替代方法?谢谢.s

编辑: processMessages 每秒被调用一次,但我没有从事件中得到任何输出

4

3 回答 3

2

在哪里timer声明和定义?

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

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

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

public:
    void connect( /* ... */ ) {

            // ... 

            startTimer(1000);
    }
于 2012-05-19T19:43:38.733 回答
0

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

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

然后你必须像这样实现定时器事件:

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

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

于 2012-05-20T07:15:32.943 回答
0

这不起作用,因为 processMessages() 不是SLOT.

 So Declare processMessages() as a private slot and then try.
于 2012-05-19T18:25:13.357 回答