2015-12-07 9 views
6
def main(): 
    app = QtWidgets.QApplication(sys.argv) 

    w = QtWidgets.QWidget() 
    w.show() 

    app.exec() 

これはPyQt5フレームワークの非常に単純なPython GUIプログラムです。実際に私はGUIプログラミングの初心者でもあるQtに精通していません。上記のプログラムのように、QWidgetと同様にQApplicationのオブジェクトが作成されています。この場合、appオブジェクトにはwオブジェクトが含まれていないため、2つのオブジェクトの間に接続がありません。だから、QApplicationのオブジェクトを作成し、そのオブジェクトを使って実行する必要があるのはなぜですか? ありがとうございました!なぜ私は `QApplication`のオブジェクトを作成する必要があり、PyQt GUIプログラミングの目的は何ですか?

+3

Qtの紹介をお読みください。 QApplicationが必要な理由や、アプリケーションにUIが必要ない場合のオプションについて説明する必要があります。 [これを紹介しています](https://wiki.qt.io/Qt_for_Beginners) – RedX

答えて

7

QApplicationを作成する必要はありませんが、多くのことを行う便利なクラスです。

the manualでそれを見つけることができますが、サンプルコードでは2つのことを説明できます。

app = QtWidgets.QApplication(sys.argv) 

ここで、QApplicationを作成し、そのコンストラクタに引数を渡します。 Qt understands certain argumentsであり、アプリケーションの実行時に使用できます。あなたが言ったように

app.exec_() 

は、appwの間の相互作用があるように表示されません。しかし、接続があります!

QtのGUIが機能するためには、メインスレッドでイベントループが必要です。 exec_()を呼び出すと、このイベントループが開始されます。

QApplication::exec()のドキュメントを引用する:

は(出口までメインイベントループと待機を開始します)が呼び出され、その後 は(出口場合は0である()(終了するように設定された値を返します)は、via quit()によって呼び出された です。

イベント処理を開始するには、この関数を呼び出す必要があります。 メインイベントループは、ウィンドウシステムからイベントを受信し、 をアプリケーションウィジェットにディスパッチします。

だから、できるだけ早くあなたがexec_()を呼び出すよう、コントロールは、あなたのmain()機能を残し、あなたが終了するように指示するまで、UIイベントへの応答を開始します。

ほとんどすべてのデスクトップのGUIは、ある程度この方法で動作しますが、それらのすべてがあなたのためにイベントループを設定する素敵なアプリケーションオブジェクトを持っているわけではありません。イベント駆動型プログラミングに慣れていない場合は、コンセプトを読んでみてください。 This Wikipedia articleは悪い場所ではありません。

+0

実際には、QWidgetオブジェクトを作成して作成する前に、QApplicationオブジェクトを用意する必要があります。イベントキューを使用するかどうかを指定します。 'QApplication'は単なるコンビニエンスクラスではなく、基本的にGUIシステムの実行に必要なコアバックグラウンドのGUIオブジェクトのほとんどを設定します。これは 'QtCoreApplication'が設定して制御するすべてのコアQt機能に加えてあります。 – RobbieE

関連する問題