0

QSignalMapper 複数の信号をオブジェクトからメイン プログラムのスロットに接続するプログラムを取得しました。

class A()
{
    private:
        QSignalMapper * signalMapperRead_;
        std::vector<Service*> services_;
    public:
    void initConnection()
    {
        signalMapperRead_ = new QSignalMapper();

        connect(signalMapperRead_, SIGNAL(mapped(int)), this, SLOT(readyToSendToService(int)));

        for ( size_t i = 0 ; i < services_.size() ; ++i )
        {
            connect(services_.at(i), SIGNAL(readyToSendToServer()), signalMapperRead_, SLOT(map()));
            signalMapperRead_->setMapping(services_.at(i), (int)i);
        }
    }

    int run()
    {
        initConnection();
        for(;;)
        {
             //do stuff;
        }
    }

};

int main()
{
    QApplication app(argc, argv);
    A * a  = new A();
    a->run();
    return app.exec
}

次に、プログラムは一種のサーバーであるため、彼をループさせ、新しいクライアントを待ちます...

しかし、スロットが呼び出されることはありません。プログラムが常にループしており、シグナルが発行されたかどうかを確認していないためではないかと考えています。

手伝ってくれませんか

4

3 に答える 3

2

独自のループを使用せず、QApplication を作成し、その exec() メソッドを呼び出します。

Qt がシグナルを配信するには、QApplication::exec()を呼び出す必要があります。

変更されたコードの編集: for(;;) ループを削除するだけです。不要です。QApplication::exec() には独自のループがあります。

于 2013-03-23T16:53:01.957 に答える
1

しかし、スロットが呼び出されることはありません。

QtのドキュメントにQApplication::execは次のように書かれています:

メイン イベント ループに入り、exit() が呼び出されるまで待機します [...]。イベント処理を開始するには、この関数を呼び出す必要があります。メイン イベント ループは、ウィンドウ システムからイベントを受け取り、アプリケーション ウィジェットにディスパッチします。[...] 一般に、 exec() を呼び出す前にユーザーとのやり取りを行うことはできません。[...]

これはexec 、シグナルスロットシステムを処理するメソッドであることを意味します。実際のループの実行をブロックする無限ループを含む (関数A::runの前に)呼び出しているため、シグナルが失われます。execfor(;;)

于 2013-03-23T17:33:21.083 に答える
-1

回避策を見つけました。それが非常に効率的かどうかはわかりませんが、私の解決策はループQEventLoopのすべてのサイクルで開始することであり、これをタイムアウトで終了させましたfor(;;)QEventLoopQTimer

于 2013-03-23T17:38:10.043 に答える