Qt4.5:app.exec前に、イベントループベースのlocalsocketを使用して
-
20-09-2019 - |
質問
私はQtの持つ実用的な問題に直面しています。私は別のプロセスにQLocalSocketと通信クラスを使用しています(パイプ/ Unixソケット)と私は、他のイベントが発生する前に、その通信を行う必要があり、それがapp.exec前にある()はすぐにアプリを起動すると、起動する(またはより正確に)。イベントループが開始される前に、私はクラスのメソッドを呼び出す場合、それは動作しませんので、私が使用しているクラスは、イベントループを必要とします。イベントループの準備ができたときに何かを起動する方法はありますか?私は隠されたイベントのみのウィンドウを作ることを考えて、非表示のウィンドウコンストラクタに私の職務を行うには、トップレベルとしてこのウィンドウを築くます。
基本的に、私はイベントループが利用可能になるとすぐに開始するには、このローカルソケット通信タスクを必要としています。
任意のアイデア?
ありがとうございます。
解決
あなたははQApplication :: execのを呼び出す前に、 QEventLoop に使用して、別のイベントループを開始することができます()。あなたのクラスから「完了」信号を発し、QEventLoopに()スロットを終了することを接続する、または使用しているQtのクラスで提供される既存の信号を使用する必要があります。
ここでQNetworkAccessManagerを使用してWebページを取得する簡単な例です。
app = QtCore.QCoreApplication([])
manager = QtNetwork.QNetworkAccessManager()
req = QtNetwork.QNetworkRequest(QtCore.QUrl("http://www.google.com"))
resp = manager.get(req)
eventloop = QtCore.QEventLoop()
eventloop.connect(resp, QtCore.SIGNAL('finished()'), QtCore.SLOT('quit()'))
eventloop.exec_() # this will block until resp emits finished()
print resp.readAll()
app.exec_()
これはあなたのニーズに合うかもしれませんが、あなたは、単にそれが終わっています一度あなたが、あなたのウィンドウ上でshow()を呼び出す前に持っているものは何でもビジネスを行うことができない理由、私はかなり)(、コール・ショーを理解することができませんでした。
他のヒント
あなただけの他のすべての前に通信を開始する必要がある場合は、単純には0ms遅延でシングルショットタイマーを使用することができます:
QTimer::singleShot(0, commsInstancePtr, SLOT(startCommunication()));
あなたが実際に他のすべてを行う前に完了するために、あなたの操作が必要な場合は、、ダニエルのソリューションは、より適切かもしれません。