2016-06-26 5 views
0

私はPythonとpyqt4 を使用してGUIプログラミングを学習しており、これは私がシグナルとスロットを学ぶために取り組んでいるアプリケーションです。 これはスピンボックスとpyqtシグナルを使って接続されたダイアログボックスを持つシンプルなアプリケーションです。クラスzerospinboxを追加しました。スピンボックスやダイアログボックスの値が0になるたびにコンソールにメッセージを出力し、QObject.Emit()シグナルを使ってその発生数を数えます。 は、私はそれを書くためのチュートリアル本を続き、何でも私はあなたのコードを見て、私は間違っているところを教えてくださいすることができた場合、それはmassage.Soが表示されない操作を行います。PyQt4シグナルと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

3つのスピンボックスを作成しましたが、最初のものだけをダイアログレイアウトに追加しました。示されているのはQSpinBoxであり、ZeroSpinBoxではありません。他の2つは表示されずに削除されます。

旧式の信号/スロット構文を使用していて、スペルミスが発生したため、接続できませんでした。この古いスタイルの古い構文を使用しないでください。非常にエラーが発生しやすく、失敗した場合は例外を発生しません。常に新しいスタイルの構文を使用します。

 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

ありがとうございました。私はpyqt4とGUIプログラミングを学ぶために読んでいる本は古くなっていると思います。あなたはpyqt4やpyqt5を学ぶのに使うことができる本やチュートリアルを知っていますか? @kouroshdaryaee。 –

+0

[PyQt Wiki](http://wiki.python.org/moin/PyQt)には便利なリンクがいくつかありますが、最新ではありません。 – ekhumoro