1

私は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は毎秒呼び出されていますが、イベントから出力が得られません

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

processMessages()はではないため、これは機能しませんSLOT

 So Declare processMessages() as a private slot and then try.
于 2012-05-19T18:25:13.357 に答える
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 に答える