2016-06-26 1 views
0

J'apprends la programmation GUI en utilisant python et pyqt4 et c'est l'application que je travaille pour apprendre Signal et Slots. Ceci est une application simple qui a un spinbox et une boîte de dialogue qui se connectent ensemble en utilisant des signaux pyqt. mais j'ai ajouté un zerospinbox de classe, il est supposé imprimer le massage à la console chaque fois que la valeur de spinbox ou boîte de dialogue devient zéro et compte le nombre d'occurrence de lui en utilisant un signal, QObject.Emit(). Je suivi livre tutoriel pour écrire et quoi que je fasse il ne montre pas le massage.So si vous pouvez s'il vous plaît jeter un oeil au code et me dire où je me trompe:PyQt4 Signal et QObject.Emit()

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

class Form(QDialog): 

    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 

     dial = QDial() 
     dial.setNotchesVisible(True) 
     spinbox = QSpinBox() 

     layout = QHBoxLayout() 
     layout.addWidget(dial) 
     layout.addWidget(spinbox) 
     zerospinbox = ZeroSpinBox() 
     self.setLayout(layout) 

     self.connect(dial, SIGNAL("valueChanged(int)"), 
        spinbox,SLOT("setValue(int)")) 
     self.connect(spinbox, SIGNAL("ValueChanged(int)"), 
        dial,SLOT("setValue(int)")) 
     self.setWindowTitle("Signal and Slots") 
     zerospinbox = ZeroSpinBox() 

     self.connect(zerospinbox, SIGNAL("atzero"),self.announce)   

    def announce(self,zeros): 
     print("ZeroSpinBox has been at zero %d times" % zeros)   

class ZeroSpinBox(QSpinBox): 

    zeros=0 


    def __init__(self, parent=None): 
     super(ZeroSpinBox, self).__init__(parent) 
     self.connect(self, SIGNAL("valueChanged(int)"), self.checkzero) 



    def checkzero(self): 
     if self.value()==0: 
      self.zeros +=1 
      self.emit(SIGNAL("atzero"),self.zeros) 

app =QApplication(sys.argv) 
form = Form() 
form.show() 
app.exec_() 

grâce

Répondre

0

Vous avez créé trois boîtes de sélection, mais n'a ajouté que le premier à la disposition de la boîte de dialogue. Le seul qui est montré est un QSpinBox, pas un ZeroSpinBox. Les deux autres sont supprimés sans être affichés.

Vous avez utilisé l'ancienne syntaxe de signal/emplacement et avez créé une erreur d'orthographe. La connexion n'a donc pas fonctionné. N'utilisez pas cette syntaxe obsolète de style ancien. Il est très sujet aux erreurs et ne déclenche pas d'exception en cas d'échec. Toujours utiliser la nouvelle syntaxe de style:

 dial.valueChanged[int].connect(spinbox.setValue) 
     spinbox.valueChanged[int].connect(dial.setValue) 

Vous avez créé une sous-classe spinbox qui n'est pas vraiment nécessaire. Il serait beaucoup plus simple de tout faire dans la classe principale:

 spinbox.valueChanged[int].connect(self.announce) 
     self.zeros = 0 

    def announce(self, value): 
     if value == 0: 
      self.zeros += 1 
      print("SpinBox has been at zero %d times" % self.zeros) 
+0

merci. le livre que je lis pour apprendre la programmation de gui avec pyqt4 est démodé je pense. Connaissez-vous un livre ou un tutoriel qui peut être utilisé pour apprendre pyqt4 ou pyqt5? –

+0

@kouroshdaryaee. Le [PyQt Wiki] (http://wiki.python.org/moin/PyQt) contient des liens utiles, mais ils ne sont pas tous à jour. – ekhumoro