2013-11-13 27 views
7

Tamam, yani hemen hemen her öğretici/anlaşılabilir yazılmış-in-insan-dil-dokümantasyon PyQt4 içindir. Ancak, PyQt5'in tüm 'bağlantı düğmesinin bir yuvaya nasıl çalıştığı' değişti ve hala bunu nasıl yapacağımı anlayamıyorum. PyQt5: QPushButton'unu yuvaya nasıl bağlarım?

Ben QtDesigner hızlı bir GUI yaptım ve bir QPushButton ve bir etiket var. Düğmeyi tıkladığımda, etiket üzerindeki metnin değişmesini istiyorum. C++ içinde QtDesigner'da, ikisini birleştirmek kolaydır. Ama hepsini python'da yazmalıyım.

Ben dosyayı .py için pyuic5 ile .ui dosyayı dönüştürmek. Yöntemin sonunda, daha sonra

self.testButton = QtWidgets.QPushButton(self.centralWidget) 
self.testButton.setObjectName("newGame") 

şöyle Orada, Ui_MainWindow sınıfında, ben setupUI yöntemini görebilirsiniz, yani

QtCore.QMetaObject.connectSlotsByName(MainWindow) 

dürüst olmak gerekirse, diyoruz ama, self.button başlatır Ne yaptığını ve nereye bağlandığını anlayamıyorum. QMainWindow devralmasını Ana sınıfında

, ben bir sonraki yöntem

@pyqtSlot(name='change') 
def change_text(self): 
    self.ui.testLabel.setText("Button Clicked!") 

yazma Ve ben o yuvaya düğme sinyalini bağlamak anlamaya olamaz. Pyqt4'te, button.clicked.connect (self.change_text) ile manuel olarak kurabilirdim, ancak öğrendiğim gibi, PyQt5 bu basit kurulumu kaldırmış ve atmıştır.

, herkes bu konuda bana yardım eder misiniz?

cevap

15
siz "PyQt5 bütün işleri 'bir yuvaya için düğmeye bağlamak' nasıl değiştiğini" Bu fikre nereden bilmiyorum

ama kesinkes yanlıştır. kolayca resmi PyQT belgelerinden görülebileceği gibi, böyle bir değişiklik olmamıştır:

Ama herhangi bir belge okumadan, bunu kendine test etmek için yeterli kolaydır. Örneğin, aşağıdaki komut, sadece ilk iki satırda komutları geçiş ve sadece aynı çalışacak:

diğer noktaları gelince
# from PyQt5.QtWidgets import (
from PyQt4.QtGui import (
    QApplication, QWidget, QVBoxLayout, QPushButton, QLabel, 
    ) 

class Window(QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.button = QPushButton('Test', self) 
     self.label = QLabel(self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QVBoxLayout(self) 
     layout.addWidget(self.label) 
     layout.addWidget(self.button) 

    def handleButton(self): 
     self.label.setText('Button Clicked!') 

if __name__ == '__main__': 

    import sys 
    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

: Şu andaki bilgi halde, sana olabilir söyleyebilirim connectSlotsByName ve pyqtSlot güvenli bir şekilde yok sayılır. Kullanımlarına sahip olmalarına rağmen (ayrıntılar için yukarıdaki belgelere bakınız), uygulamaların% 95'inde kullanmak için çok nadiren herhangi bir gerçek ihtiyaç vardır.

özel durum için

, sözdizimi basitçe:

self.testButton.clicked.connect(self.change_text) 
    ... 

def change_text(self): 
    self.ui.testLabel.setText("Button Clicked!") 
+5

> sana "PyQt5 işleri bütün 'bir yuvaya için düğmeye bağlamak' nasıl değiştiğini" Bu fikre nereden biliyorum, ama yok tamamen ve tamamen yanlıştır. Buradan aldım: http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html Paragrafa bakın: 'Eski stil sinyalleri ve yuvaları'. "QObject.connect() pyqt5'te uygulanmadı", evet. bunu çalıştırmayı denediğinizde Ayrıca, ben olsun, böyle bir şey çalıştırmak için olsun! "AttributeError: QPushButton nesne yok niteliği bağlamak etti" :( –

+0

Bekle ben yanlış ne yaptığını bulduk!Kendimi bu bağlantıya (pyqt4_differences) ve önerinin kod önerisinde 'tıklanma' göstermediğine işaret ediyordum, bu da bana bunu yapmanın bir yolu olmadığına inanmamı sağladı! Kötüyüm, hep kötüyüm, cevapladığın için teşekkürler, yanılmışım :( –

İlgili konular