PyQt4 信号和 QObject.Emit()
PyQt4 Signal and QObject.Emit()
我正在使用 python 和 pyqt4 学习 GUI 编程
这是我正在努力学习信号和插槽的应用程序。
这是一个简单的应用程序,它有一个旋转框和一个使用 pyqt 信号连接在一起的对话框。但我添加了一个 class zerospinbox ,它应该在每次旋转框或对话框值变为零时打印消息到控制台,并使用 QObject.Emit() 信号计算它出现的次数。
我按照教程书写了它,但无论我做什么,它都不会显示 massage.So 如果你可以的话,请看一下代码并告诉我哪里错了:
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_()
谢谢
您创建了三个 个旋转框,但只将其中的第一个添加到对话框布局中。唯一显示的是 QSpinBox
,而不是 ZeroSpinBox
。另外两个直接被删除了,没有显示。
您使用了旧式 signal/slot 语法并出现了拼写错误,因此连接失败。不要使用这种过时的旧式语法。它非常容易出错,并且在失败时不会引发异常。始终使用新式语法:
dial.valueChanged[int].connect(spinbox.setValue)
spinbox.valueChanged[int].connect(dial.setValue)
您创建了一个并非真正需要的旋转框子class。在主 class:
中做所有事情会简单得多
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)
我正在使用 python 和 pyqt4 学习 GUI 编程 这是我正在努力学习信号和插槽的应用程序。 这是一个简单的应用程序,它有一个旋转框和一个使用 pyqt 信号连接在一起的对话框。但我添加了一个 class zerospinbox ,它应该在每次旋转框或对话框值变为零时打印消息到控制台,并使用 QObject.Emit() 信号计算它出现的次数。 我按照教程书写了它,但无论我做什么,它都不会显示 massage.So 如果你可以的话,请看一下代码并告诉我哪里错了:
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_()
谢谢
您创建了三个 个旋转框,但只将其中的第一个添加到对话框布局中。唯一显示的是 QSpinBox
,而不是 ZeroSpinBox
。另外两个直接被删除了,没有显示。
您使用了旧式 signal/slot 语法并出现了拼写错误,因此连接失败。不要使用这种过时的旧式语法。它非常容易出错,并且在失败时不会引发异常。始终使用新式语法:
dial.valueChanged[int].connect(spinbox.setValue)
spinbox.valueChanged[int].connect(dial.setValue)
您创建了一个并非真正需要的旋转框子class。在主 class:
中做所有事情会简单得多 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)