PyQt4 信号和 QObject.Emit()

Posted

技术标签:

【中文标题】PyQt4 信号和 QObject.Emit()【英文标题】:PyQt4 Signal and QObject.Emit() 【发布时间】:2016-06-26 15:29:05 【问题描述】:

我正在学习使用 python 和 pyqt4 进行 GUI 编程 这是我正在开发的用于学习 Signal 和 Slots 的应用程序。 这是一个简单的应用程序,它有一个旋转框和一个使用 pyqt 信号连接在一起的对话框。但我添加了一个 zerospinbox 类,它应该在每次 spinbox 或对话框值变为零时将消息打印到控制台,并使用 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_()

谢谢

【问题讨论】:

【参考方案1】:

您创建了 三个 旋转框,但只将其中的第一个添加到对话框布局中。唯一显示的是QSpinBox,而不是ZeroSpinBox。其他两个只是被删除而不显示。

您使用了旧式信号/插槽语法并出现拼写错误,因此连接无法正常工作。不要使用这种过时的旧式语法。它非常容易出错,并且在失败时不会引发异常。始终使用新式语法:

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

您创建了一个并不真正需要的 spinbox 子类。在主类中做所有事情会简单得多:

        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)

【讨论】:

谢谢。我认为我正在阅读的使用 pyqt4 学习 gui 编程的书已经过时了。你知道有什么书或教程可以用来学习pyqt4或pyqt5吗? @kouroshdaryaee。 PyQt Wiki 有一些有用的链接,但并非都是最新的。

以上是关于PyQt4 信号和 QObject.Emit()的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4关闭窗口

Python PyQt4 关闭应用程序

在循环中连接 PyQt4 中的插槽和信号

使用 pyqt4 创建类信号

PyQt4信号与槽

Pyqt4学习笔记-事件和信号