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