2016-06-26 6 views
0

Я изучаю программирование GUI с использованием python и pyqt4 , и это приложение, над которым я работаю, чтобы изучить сигналы и слоты. Это простое приложение, в котором есть спинбокс и диалоговое окно, которые соединяются вместе с использованием сигналов pyqt. но я добавил класс zerospinbox, он должен печатать массаж для консоли каждый раз, когда значение spinbox или dialogbox становится равным нулю и подсчитывает количество его появления с использованием сигнала QObject.Emit(). Я последовал за учебник книгу, чтобы написать это и все, что я делаю это не показывает massage.So, если вы можете, пожалуйста, взгляните на код и скажите мне, где я не прав:PyQt4 Signal и 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_() 

благодаря

ответ

0

Вы создали три spinboxes, но только добавили первый из них в макет диалога. Единственное, что показано, это QSpinBox, а не ZeroSpinBox. Остальные два просто удаляются без отображения.

Вы использовали синтаксис сигнала/слота старого стиля и произвели орфографическую ошибку, поэтому соединение не сработало. Не используйте этот устаревший синтаксис старого стиля. Он очень подвержен ошибкам и не вызывает исключения, когда он терпит неудачу. Всегда используйте синтаксис нового стиля:

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

Вы создали подкласс со счётчиком, который на самом деле не нужно. Было бы намного проще делать все в рамках основного класса:

 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

спасибо. книга, которую я читаю, чтобы узнать, как программировать gui с pyqt4 устарела, я думаю. знаете ли вы какую-либо книгу или учебник, которые можно использовать для изучения pyqt4 или pyqt5? –

+0

@kouroshdaryaee. В [PyQt Wiki] (http://wiki.python.org/moin/PyQt) есть несколько полезных ссылок, но они не все обновлены. – ekhumoro