PyQt5 - 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ığı,‘signal’bir veya daha fazla olaya yanıt olarak. Sinyal kendi başına herhangi bir işlem yapmaz. Bunun yerine, bir‘slot’. Yuva herhangi olabilircallable Python function.

Qt Designer'ın Sinyal / Slot Düzenleyicisini Kullanma

Önce LineEdit denetimi ve PushButton ile basit bir form tasarlayın.

Butona basıldığında metin kutusu içeriğinin silinmesi istenir. QLineEdit gereci bu amaç için clear () yöntemine sahiptir. Dolayısıyla, düğmeclicked sinyal bağlanacak clear() metin kutusunun yöntemi.

Başlamak için, Düzenle menüsünden Sinyalleri / yuvaları düzenle'yi seçin (veya F4'e basın). Ardından düğmeyi fareyle vurgulayın ve imleci metin kutusuna doğru sürükleyin

Fare serbest bırakıldığında, düğme sinyallerini ve yuva yöntemlerini gösteren bir iletişim kutusu görüntülenecektir. Tıklanan sinyali ve temizle () yöntemini seçin

Sağ alttaki Sinyal / Slot Düzenleyici penceresi sonucu gösterecektir -

Aşağıdaki kodda gösterildiği gibi ui dosyasından UI ve Build ve Python kodunu kaydedin -

pyuic5 -x signalslot.ui -o signalslot.py

Oluşturulan Python kodu, aşağıdaki ifadeye göre sinyal ve yuva arasında bağlantıya sahip olacaktır -

self.pushButton.clicked.connect(self.lineEdit.clear)

Signallot.py'yi çalıştırın ve LineEdit'e bir metin girin. Düğmeye basıldığında metin silinecektir.

Bina Sinyal Yuvası Bağlantısı

Designer kullanmak yerine, sözdizimini izleyerek doğrudan sinyal yuvası bağlantısı kurabilirsiniz -

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 tekniklerden herhangi birinde elde edilebilir -

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, tıklanan () sinyali b1_clicked () işlevine bağlanır -

b1.clicked.connect(b1_clicked())

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

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   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