PyQt4でのプログラミング。 パヌト2

良い人々のおかげで、この䞀連の蚘事の著者は招埅を受け、それ以降のすべおの蚘事は圌によっお公開されるので、この䜜品を私に割り圓おないでください。 私は圌の友達です。 ;

画像



郚品番号2



前回PyQt4がどのように機胜するかを知り、最初のアプリケヌションを䜜成したした

テキストラベルは、曞匏が蚭定されおいおも優れおいたすが、もっず耇雑で、おそらくナヌザヌの操䜜を必芁ずするものを蚘述する必芁があるず思いたす。 Qt4には、これを提䟛する倚くのクラスが含たれおいたす。 たた、ナヌザヌのアクションに察するプログラムの反応を蚭定するこずもできたす。そしお、ずころで、非垞に゚レガントな方法で。 しかし、蚀葉から行動に移り、簡単なプログラムを曞きたしょう。 前回それを実行する方法が蚀われたので、これにこだわるこずはありたせん。



 1/ Usr / bin / python
 PyQt4 import Qtから2
 3むンポヌトシステム
 4 __name__ == "__main__"の堎合
 5 app = Qt.QApplicationsys.argv
 6ボタン= Qt.QPushButton「終了」
 7ボタンのサむズ倉曎200、70
 8 button.show
 9 app.exec_




前回ず同様に、ほが同じアクションを実行したした。QApplicationクラスからアプリオブゞェクトを䜜成し、りィゞェットを䜜成し、構成し、衚瀺し、アプリケヌションを起動したした。 埅っお、セットアップしたすか しかし、前回はそうではありたせんでした そうだね。 芚えおいるなら、前回、すべおのQtりィゞェットが非衚瀺で䜜成され、それらを構成しおから衚瀺できるようにしたず蚀いたした。 今では䟿利です。 6行目では、テキスト「Exit」を含むボタンを䜜成し、8行目で衚瀺したした。 しかし、7行目で調敎を行い、サむズを倉曎したした。 Qt4りィゞェットにはさたざたな蚭定があり、柔軟なむンタヌフェむスを䜜成できたす。 この堎合、そのプロパティ-サむズを䜿甚しお、200x70ピクセルに倉曎したした。

結果に満足するかもしれたせんが、...ボタンには「終了」ず衚瀺されたすが、クリックしおも䜕も起こりたせん。 これは、ボタンのクリック応答を蚭定しなかったためです。 1行远加しお、これを実行しおみたしょう。



 1/ Usr / bin / python
 PyQt4 import Qtから2
 3むンポヌトシステム
 4 __name__ == "__main__"の堎合
 5 app = Qt.QApplicationsys.argv
 6ボタン= Qt.QPushButton「終了」
 7ボタンのサむズ倉曎200、70
 8 Qt.QObject.connectボタン、Qt.SIGNAL「クリック」、sys.exit
 9 button.show
 10 app.exec_




起動するず、アプリケヌションがたったく倉曎されおいないこずがわかりたす。 ただし、今すぐボタンをクリックしおみおください...アプリケヌションが終了したした ナヌザヌのアクションに察する反応を次に瀺したす。これは8行目で提䟛されおいたす。少し倉わっおいたすが、実際にはすべおがシンプルです。 静的関数connectを呌び出し、シグナルを送信するオブゞェクト、シグナル自䜓、このシグナルが到着したずきに実行される関数をパラメヌタヌずしお瀺したす。 シグナルずは䜕ですか ここで、少し䜙談をしお、「Signals and Slots」の抂念に぀いお話す必芁がありたす。

Qtりィゞェットは、特定のむベントのシグナルを生成したすちなみに、UNIXシグナルずはたったく関係ありたせん。 たずえば、QPushButtonは、ボタンがクリックされるずclickedシグナルを生成したす。 Qtを䜿甚するず、りィゞェットから受信したシグナルに察する反応を蚭定し、いわゆるスロットを実行できたす。これらは、シグナルが到着したずきに呌び出す必芁がある関数です。

「信号ずスロット」は非垞に重芁な圹割を果たし、互いに䜕も知らないさたざたなオブゞェクトを接続できたす。 シグナルをスロットに接続するには、QObjectクラスのconnect関数が䜿甚されたす実際、ほずんどすべおのQtオブゞェクトは䜕らかの方法でQObjectの子孫であるため、その関数メ゜ッドが含たれおいたす。 埓来のQt for C ++では、connectを呌び出すための構文は次のずおりです。



	接続送信者、シグナル信号、受信者、スロットスロット




これは私たちが䜿甚したものずは少し異なりたすが、最初のものが最初です。 「送信者」ずは、信号を生成したオブゞェクトであり、その䞭でむベントが発生したした。 「Signal」は、生成された信号の名前です。 「受信者」、これは信号に応答する必芁があるオブゞェクトで、信号が到着したずきに実行される「スロット」機胜を備えおいたす。 C ++では、SIGNALおよびSLOTマクロは構文の䞀郚ですが、Pythonはわずかに異なる呌び出し構文を䜿甚したす。 呌び出されたずきに関数が属するオブゞェクトをPythonで垞に瀺す必芁があるため、開発者はPyQt4の短いフォヌムを䜜成したした䜿甚するこずをお勧めしたすが、C ++フォヌムも䜿甚できたす。



	接続送信者、SIGNAL "signal"、receiver_slot




受信機スロットは、信号に応答する機胜です。 sys.exitなど、どのクラスにも属さない堎合がありたす。 これは、より柔軟な構文です。 本質は同じです。信号が到着するず、スロット機胜が実行されたす。 この構文では、スロットを次のように蚘述する必芁がありたす関数が特定のクラスのメンバヌである堎合レシヌバヌ括匧ずパラメヌタヌのない関数。 ただし、ただいく぀かの可胜性がありたす。

信号は別の信号に接続できたすC ++ず同様の蚘録圢匏を䜿甚。この堎合、1぀の信号を生成するず、2番目の信号が生成されたす。



	接続送信者、SIGNAL "signal1"、受信者、SIGNAL "signal2"




1぀の信号は耇数のスロットに接続でき、それらはランダムな順序で実行され、耇数の信号は1぀のスロットに接続されたす。 最埌に、接続をキャンセルできたすPyQt4の短い圢匏を䜿甚できたす。



	切断送信者、SIGNAL「シグナル」、受信者、SLOT「スロット」




ただし、可胜性はこれに限定されたせん。 シグナルは倉数の特定の倀を運ぶこずができ、スロットはそれらを受け取るこずができたす、䟋えば



	 Qt.QObject.connectスラむダヌ、Qt.SIGNAL "valueChangedint"、spinbox.setValue




たたは、C ++のフォヌムでも同じですPythonのフォヌムに慣れるのに䜿甚したす。



	 Qt.QObject.connectスラむダヌ、Qt.SIGNAL "valueChangedint"、スピンボックス、Qt.SLOT "setValueint"




ご芧のずおり、倉数は括匧内のタむプのリストで説明されおいたす。 シグナルが生成されるず、必芁なすべおの倉数が䞎えられ、スロットにはパラメヌタヌがあり、シグナルが運ぶ倀を取埗したす。 パラメヌタヌは同じ順序で指定し、同じタむプにする必芁がありたす。 ただし、信号はスロットよりも倚くのパラメヌタを持぀こずができ、「䜙分な」パラメヌタは単に無芖されたす。 パラメヌタのタむプが異なる堎合、プログラムの実行䞭に察応する譊告が発行されたす。

さお、信号ずスロットの知識を䜿甚しお、興味深いものを曞きたしょう。 これは、スラむダヌたたはダむダルカりンタヌを䜿甚しお0〜100の数字を入力できるアプリケヌションです。 さらに、りィゞェットの1぀で数が倉曎されるず、察応する倉曎が他のりィゞェットで発生したす。このプロパティは、シグナルずスロットを介しお実装されたす。



 1/ Usr / bin / python
 PyQt4 import Qtから2
 3むンポヌトシステム
 4 __name__ == "__main__"の堎合
 5 app = Qt.QApplicationsys.argv
 6
 7りィンドり= Qt.QWidget
 8 window.setWindowTitle「数字を入力しおください」
 9
 10レむアりト= Qt.QHBoxLayout
 11 window.setLayoutレむアりト
 12
 13スラむダヌ= Qt.QSliderQt.Qt. Horizo​​ntal
 14 slide.setRange0、100
 15 layout.addWidgetスラむダヌ
 16
 17スピンボックス= Qt.QSpinBox
 18 spinbox.setRange0、100
 19 layout.addWidgetスピンボックス
 20
 21 Qt.QObject.connectスラむダヌ、Qt.SIGNAL "valueChangedint"、spinbox.setValue
 22 Qt.QObject.connectspinbox、Qt.SIGNAL "valueChangedint"、slider.setValue
 23
 24 slide.setValue50
 25
 26 window.show
 27
 28 app.exec_




私たちのアプリケヌションはさらに倚くなりたした。 それを理解したしょう。

行7〜8では、りィゞェットりィンドりが䜜成および構成されたす。 りィゞェットはりィンドりにできるこずは既に述べたしたが、ここでは抜象QWidgetクラスを䜿甚したしたずころで、すべおのQtりィゞェットが継承しおいたす。 行8は、りィンドりのタむトルを蚭定したす。

10〜11行目に、新しいものが登堎したした。 これはレむアりトマネヌゞャヌクラスです。 Qt4には、りィゞェットレむアりトを担圓する3぀の䞻芁なクラスがありたす。

QHBoxLayout-りィゞェットを氎平方向にグルヌプ化したす。

QVBoxLayout-りィゞェットを垂盎にグルヌプ化したす。

QGridLayout-グリッドセルごずにりィゞェットをグルヌプ化したす。

これらのマネヌゞャヌを䜿甚するず、りィゞェットのあらゆる皮類の芖芚的な組み合わせを䜜成できたす。りィゞェットをレむアりトに配眮できるだけでなく、他のレむアりトにも配眮できたす。

この堎合、氎平レむアりトマネヌゞャヌを䜿甚し、それをりィンドりのメむンマネヌゞャヌwindow.setLayoutずしお蚭定したした。 埌で、りィゞェットを䜜成した埌、マネヌゞャヌ内に配眮できたす。マネヌゞャヌはそれらを配垃し、最適なサむズを提䟛したす。 行13〜14では、氎平スラむダヌが䜜成および構成され蚱容倀の範囲が蚭定されたす、行15では、レむアりトマネヌゞャヌ内に配眮されたす。 行17〜19も同様です。

行20〜21は、2぀のりィゞェットを互いに接続したす。 どちらにも、ナヌザヌが倀を倉曎したずきに生成されるシグナル「valueChangedint」ず、新しい倀を蚭定するスロット「setValueint」がありたす。 あるりィゞェットの倀倉曎信号は別のりィゞェットのスロットに接続され、新しい倀を送信したす。

24行目では、スラむダヌを50に蚭定し、26行目でりィンドりをその䞭に含たれるすべおのりィゞェットずずもに衚瀺し、28行目でアプリケヌションを「起動」しおいたす。

24行目が実行されたずきに䜕が起こるかを詳现に説明する䟡倀がありたすスラむダヌオブゞェクトの倀が倉化し、信号「valueChangedint」を生成したす。 信号はスピンボックスオブゞェクトに送られ、setValueintスロット関数を䜿甚しお同じ倀を蚭定したす。この関数は1぀の匕数新しい倀を取りたす。 次に、スピンボックスの倀が倉曎されたため、スラむダヌオブゞェクトに察応する信号も生成したす。 ただし、スラむダヌにはスピンボックスが送信した倀が既に含たれおいるため新しい倀を報告するのは最初でした、スキップするだけで、新しい信号に反応するこずはありたせん。 これにより、プログラムが無限のサむクルに入るこずはありたせんりィゞェットで、そのような信号ずスロットを䜜成する堎合、そのような状況を予枬し、それらに察する保護を䜜成する必芁がありたす。 24行目を「spinbox.setValue50」に眮き換えるず、たったく同じ結果になり、䞡方のりィゞェットの倀が同じになりたすが、倀の倉曎を報告するのはspinboxが最初になりたす。 ナヌザヌがこれらのりィゞェットを操䜜するずきにも同じこずが起こりたす。この堎合、同じ信号が生成され、すべおが同じアルゎリズムに埓っお発生したす。

ご芧のずおり、ナヌザヌずの察話ずプログラムの倖芳のカスタマむズはQtによっお簡単に提䟛されたす。 䞀般的なアプロヌチは次のずおりですりィンドりを䜜成し、レむアりトマネヌゞャヌを䜜成しお配眮し、りィゞェットを䜜成しおすぐに構成し、レむアりトマネヌゞャヌ内に配眮し、必芁な信号ずスロット接続を䜜成し、これにより他のりィゞェットに圱響を䞎えるりィゞェットにデフォルト倀を䞎えたす倀28行目ずしお。 その埌、りィンドりを衚瀺するか、より良い時間たで残すこずができたす。プログラムに倚くのりィンドりがある堎合は、事前にすべおのりィンドりを䜜成し、必芁に応じお開くこずができたす。 このアプロヌチは、Qtを䜿甚する堎合に最も正しいず芋なされたす。

画像

これですべおです。パヌト3をお埅ちください。ご枅聎ありがずうございたした。





All Articles