イベントは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()スロットに接続します。