9

現在、プロジェクト用のGUIライブラリが必要です。私はPythonに精通しており、PyQtが良い選択かもしれないことがわかりました。

私はPyQtについてのチュートリアルを読んでいて、次のサンプルプログラムについてかなり混乱しています

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
ZetCode PyQt4 tutorial 

In this example, we draw text in Russian azbuka.

author: Jan Bodnar
website: zetcode.com 
last edited: September 2011
"""

import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):      

        self.text = u'\u041b\u0435\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\
\u0435\u0432\u0438\u0447 \u0422\u043e\u043b\u0441\u0442\u043e\u0439: \n\
\u0410\u043d\u043d\u0430 \u041a\u0430\u0440\u0435\u043d\u0438\u043d\u0430'

        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('Draw text')
        self.show()

    def paintEvent(self, event):

        qp = QtGui.QPainter()
        qp.begin(self)
        self.drawText(event, qp)
        qp.end()

    def drawText(self, event, qp):

        qp.setPen(QtGui.QColor(168, 34, 3))
        qp.setFont(QtGui.QFont('Decorative', 10))
        qp.drawText(event.rect(), QtCore.Qt.AlignCenter, self.text)        


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

ここで、main関数では、Exampleオブジェクトが作成されるため、__init__()functioninitUI()が呼び出されます。paintEvent()私の質問は、関数はどこで呼び出されるのですか?プログラムを実行self.text(some Russian letters)すると、ウィジェットに正確に表示されるためです。

言い換えれば、sys.exit(app.exec_())実際には何をしているのでしょうか?なぜpaintEvent()関数を呼び出すのですか?

ありがとう!

4

3 に答える 3

8

PyQtドキュメントから:

int QApplication.exec_ ()

メインイベントループに入り、exit()が呼び出されるまで待機してから、設定された値を返します(を介して呼び出されexit()た場合は0です)。exit()quit()

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

別のソースから:

sys.exit(app.exec_())

最後に、アプリケーションのメインループに入ります。イベント処理はこの時点から始まります。メインループはウィンドウシステムからイベントを受け取り、それらをアプリケーションウィジェットにディスパッチします。メソッドを呼び出すexit()か、メインウィジェットが破棄されると、メインループは終了します。このsys.exit()メソッドは、クリーンな出口を保証します。アプリケーションがどのように終了したかが環境に通知されます。

exec_()メソッドにはアンダースコアがあります。これは、execがPythonキーワードであるためです。したがって、exec_()代わりに使用されました。

塗装について:

4.2.1。塗装が発生したとき

このpaintEvent()メソッドは、次の場合に自動的に呼び出されます。

  • ウィジェットが初めて表示されます。

  • ウィンドウを移動してウィジェットの一部(またはすべて)を表示した後。

  • ウィジェットが置かれているウィンドウは、最小化された後に復元されます。

  • ウィジェットが置かれているウィンドウのサイズが変更されます。

  • ユーザーは、別のデスクトップからウィジェットのウィンドウが置かれているデスクトップに切り替えます。

を呼び出すことにより、ペイントイベントを手動で生成できますQWidget::update()QWidget::update()ペイントイベントを生成する前にウィジェットを消去します。に引数を渡すことができますupdate()。これにより、ペイントを必要とする領域(特に長方形)にのみペイントを制限できます。このメソッドの2つの同等の形式は、QWidget::update (int x, int y, int width, int height)QWidget::update (QRect rectangle)です。ここで、xyは長方形の左上隅を示し、幅と高さは明らかです。ペイントイベントをイベントキューに配置するためupdate()、現在のメソッドが終了して制御がイベントハンドラーに戻るまで、ペイントは発生しません。他のイベントが処理されるのを待っている可能性があり、GUIがスムーズに動作するには、イベントをタイムリーに処理する必要があるため、これは良いことです。

ウィジェットのペイントを呼び出すこともできますQWidget::repaint (int x, int y, int width, int height, bool erase)(またはいくつかの便利なメソッドフォームの1つ)。ここで、すべての引数はメソッドの場合と同じ意味であり、update()eraseは長方形をペイントする前に消去するかどうかをrepaintに指示します。repaint()直接呼び出しpaintEvent() ます。ペイントイベントはイベントキューに配置されないため、この方法は注意して使用してください。たとえば、単純なループから繰り返し呼び出しrepaint()てアニメーションを作成しようとすると、アニメーションは描画されますが、マウスボタンのクリック、キーボードの押下などに対応するイベントが発生するため、ユーザーインターフェイスの残りの部分は応答しなくなります。キューで待っています。アニメーションほど時間がかかる可能性のあるタスクを実行していない場合でも、通常は使用することをお勧めしますupdate()GUIを存続させるのに役立ちます。

ウィジェットの外で何かをペイントするpaintEvent()場合でも、同じものをにペイントするために必要なロジックとコマンドを含める必要がありますpaintEvent()。そうしないと、次にウィジェットが更新されたときに、行ったペイントが消えてしまいます。

于 2012-08-04T05:16:17.833 に答える
1

app.exec_()qtメインループを開始します。これは、作成されたすべてのウィジェットが破棄されたときに終了します(たとえば、ウィンドウを閉じることによって)。この関数は、指定されたクラスのようなサブクラスpaintEventからオーバーロードできるメソッドであり、QTがウィジェットを表示、更新、または再描画するときに呼び出されます。QWidgetExample

これらのことは、QtドキュメントまたはPyQtドキュメント(ほとんどの場合、異なる形式のQTドキュメントのコピーですが、PyQt固有のものに関するいくつかの貴重な情報が含まれている場合があります)で調べることができます。

于 2012-08-03T10:13:26.507 に答える
1

たとえば、WinapiやC言語のXツールキットなど、低レベルのプログラミングの経験があると、より明確になります。PyQtは(非常に)高レベルのツールキットです。巨大な機能が組み込まれています。同様の例では、数百行または数千行のCコードが必要になります。結果として、舞台裏で多くのことが起こっています。誰かがすでに基本的なレベルでペイントを扱うコードを作成しました。GUIプログラミングは非常に複雑であり、最新のGUIツールキットを使用すると、アプリケーションプログラマーはこの複雑さから保護されます。技術的な詳細をすべて知らないと、プログラマーが混乱することは避けられません。

PyQtでは、基本的に2つの方法でイベントを処理しています。信号をスロットに接続するか、イベントハンドラーを再実装します(イベントハンドラーはスロットの同義語です)。QtGui.QWidget提供されている例は、すでにいくつかのペイントコードが利用可能なから継承されています。カスタムペイントを行うには、既存のpaintEvent()イベントハンドラーを再実装する必要があります。状況に応じて、親のpaintEvent()メソッドを呼び出す場合と呼び出さない場合があります。

はメソッドsys.exit(app.exec_())を呼び出しません。paintEvent()このexec_()メソッドはイベントループを開始します。イベントループは、イベントをキャッチしてディスパッチします。ペイントイベントは、ユーザーまたはオペレーティングシステムによってトリガーされます。たとえば、例を起動すると、paintイベントが2回トリガーされます。(print "Event occurred"イベントハンドラーに行を入力して、このメソッドが呼び出される回数を確認します。)ウィンドウのサイズ変更、フォーカスの喪失または取得、ウィンドウの最小化または最大化、これらすべてにより、ペイントイベントがトリガーされます。

于 2013-10-06T12:17:47.093 に答える