PyQt4-シグナルとイベント

イベント
イベントはGUIプログラミングの重要な部分です。 イベントは、ユーザーまたはシステムによって生成されます。 exec()メソッドを呼び出すと、アプリケーションはメインループを開始します。 イベントを受信し、オブジェクトに送信します。 Trolltechは、独自の信号およびスロットメカニズムを提供します。

信号とスロット
ユーザーがボタンをクリックしたとき、チェックボックスをマークしたときなどに、シグナルが生成されます。シグナルは環境から送信することもできます。 たとえば、タイマーがトリガーされたとき。 スロットは、信号に応答する方法です。
#!/usr/bin/python

import sys
from PyQt4 import QtGui, QtCore

class SigSlot(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

self.setWindowTitle('signal & slot')

lcd = QtGui.QLCDNumber(self)
slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)

vbox = QtGui.QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(slider)

self.setLayout(vbox)
self.connect(slider, QtCore.SIGNAL('valueChanged(int)'),
lcd, QtCore.SLOT('display(int)') )

self.resize(250, 150)

app = QtGui.QApplication(sys.argv)
qb = SigSlot()
qb.show()
sys.exit(app.exec_())

この場合、スライダーとLCDダイヤルを表示します。 スライダーをドラッグすると、ダイヤル上の数字が変わります。
self.connect(slider, QtCore.SIGNAL('valueChanged(int)'),
lcd, QtCore.SLOT('display(int)'))

ここで、valueChanged()スライダー信号をダイヤルのディスプレイ()スロットに接続します。
connect()メソッドには4つのパラメーターがあります。 Sender-シグナルを送信するオブジェクト。 シグナル -生成されたシグナル受信者 -信号を受信するオブジェクト。 スロットは、信号に応答する方法です。
信号とスロット

イベントハンドラーの変更
PyQt4のイベントは、イベントハンドラーを変更することで頻繁に処理されます。
#!/usr/bin/python

import sys
from PyQt4 import QtGui, QtCore

class Escape(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

self.setWindowTitle('escape')
self.resize(250, 150)
self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )

def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.close()

app = QtGui.QApplication(sys.argv)
qb = Escape()
qb.show()
sys.exit(app.exec_())

この例では、keyPressEvent()イベントハンドラを再初期化します。
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.close()

Escapeボタンをクリックすると、アプリケーションが閉じます。

信号生成
QtCore.QObjectから作成されたオブジェクトは信号を生成できます。 ボタンをクリックすると、クリックされた()シグナルが生成されます。 次の例では、これを行う方法を示します。
#!/usr/bin/python

import sys
from PyQt4 import QtGui, QtCore

class Emit(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

self.setWindowTitle('emit')
self.resize(250, 150)
self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )

def mousePressEvent(self, event):
self.emit(QtCore.SIGNAL('closeEmitApp()'))

app = QtGui.QApplication(sys.argv)
qb = Emit()
qb.show()
sys.exit(app.exec_())

新しいcloseEmitApp()シグナルを作成します。 この信号は、マウスボタンが押されたときに生成されます。
def mousePressEvent(self, event):
self.emit(QtCore.SIGNAL('closeEmitApp()'))

シグナルは、emit()メソッドを使用して作成されます。
self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()'))

ここで、作成したcloseEmitApp()シグナルをclose()スロットに接続します。


Source: https://habr.com/ru/post/J31690/


All Articles