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



All Articles