PyQt - Sinyaller ve Yuvalar

Sıralı bir şekilde yürütülen bir konsol modu uygulamasının aksine, GUI tabanlı bir uygulama olay güdümlüdür. İşlevler veya yöntemler, kullanıcının bir düğmeyi tıklama, koleksiyondan bir öğeyi seçme veya fare tıklaması vb. Gibi eylemlerine yanıt olarak yürütülür.events.

GUI arayüzünü oluşturmak için kullanılan pencere öğeleri bu tür olayların kaynağı olarak hareket eder. QObject sınıfından türetilen her PyQt parçacığı, 'signalbir veya daha fazla olaya yanıt olarak. Sinyal kendi başına herhangi bir işlem yapmaz. Bunun yerine, bir 'ile' bağlıdır 'slot'. Yuva herhangi olabilircallable Python function.

PyQt'da, bir sinyal ve bir yuva arasındaki bağlantı farklı şekillerde sağlanabilir. En sık kullanılan teknikler aşağıdadır -

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Bir pencere öğesi tarafından bir sinyal yayıldığında, bir slot_function çağırmanın daha uygun bir yolu aşağıdaki gibidir -

widget.signal.connect(slot_function)

Bir düğme tıklandığında bir işlevin çağrılıp çağrılmayacağını varsayalım. Burada tıklanan sinyal, çağrılabilir bir işleve bağlanacaktır. Aşağıdaki iki teknikten herhangi birinde elde edilebilir -

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

veya

button.clicked.connect(slot_function)

Misal

Aşağıdaki örnekte, QDialog penceresine iki QPushButton nesnesi (b1 ve b2) eklenmiştir. Sırasıyla b1 ve b2'ye tıklandığında b1_clicked () ve b2_clicked () işlevlerini çağırmak istiyoruz.

B1 tıklandığında, clicked () sinyali b1_clicked () işlevine bağlanır

b1.clicked.connect(b1_clicked())

B2 tıklandığında, clicked () sinyali b2_clicked () işlevine bağlanır

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

Misal

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)

   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

Yukarıdaki kod aşağıdaki çıktıyı üretir -

Çıktı

Button 1 clicked
Button 2 clicked