【问题标题】:Custom signal not working in PySide自定义信号在 PySide 中不起作用
【发布时间】:2015-07-17 16:37:35
【问题描述】:

我是 PySide 的新手,我正在尝试发出一个信号并从另一个类接收它。

我在 MySignal 类的对象上使用了 emit,并且信号是从 MyRadioButton 类发出的。发射和连接都返回 True 但正如我所愿,更新方法没有被调用

这是文件和代码的基本结构。

# MySignals.py
from PySide.QtCore import QObject, Signal

class MyCheckedSignal(QObject):
    signal = Signal(str)


# MyRadioButton.py
class MyRadioButton(QWidget, QObject):
    def __init__(self, value=None, label=None):
        QWidget.__init__(self)
        self.__value = value
        self.__checked = False
        self.checkSignal = MySignals.MyCheckedSignal()

    def toggleCheck(self):
        if self.__checked == False:
                self.__checked = True
                self.checkSignal.emit(SIGNAL(self.__value))
        else:
                self.__checked = False


# MyRadioGroup.py
class MyRadioGroup(QObject):
    def __init__(self, radioes=None):
        QObject.__init__(self)
        for radio in radioes:
            # radio is of type MyRadio
            # self.connect(radio, SIGNAL("checked()"), self.update)
            radio.checkSignal.signal.connect(self.update)
            # self.connect(self.update)

    def update(self, value):
        print("Checked", value)

【问题讨论】:

  • 这是真实的代码吗?它看起来很奇怪。为了发出信号,self.__value 必须是"signal(QString)"。此外,信号必须只发送一个字符串参数,否则会引发TypeError。所以如果你说connectemit都返回True,那么你发布的代码并不能准确地代表你的真实代码。

标签: python pyside


【解决方案1】:

前言:您对基类的选择似乎很奇怪:您的 MyRadioButton 可能应该从 QRadioButton 继承,而您的 MyRadioGroup 将受益于从 QGroupBox 继承,这是一个适当的小部件,因此将集成与应用程序的其余部分很好。查看里面的描述以获取带有布局的具体示例。

对于您的具体问题,并且不使用现有的QRadioButton,您无需为信号创建特殊类。只需将您的MyRadioButton 声明如下:

class MyRadioButton(QPushButton):
    checkSignal = QtCore.Signal(str)

    def __init__(self, value=None, label=None):
        QPushButton.__init__(self)
        self.__value = value
        self.__checked = False
        self.setCheckable(True)  # This will 'hold' the button once clicked
        self.clicked.connect(self.toggleCheck)  # Signal emitted on click

    def toggleCheck(self):
        if self.__checked == False:
                self.__checked = True
                self.checkSignal.emit(self.__value)
        else:
                self.__checked = False

请注意,要激活您的 toggleCheck 方法,您必须将来自 QAbstractButton: clicked 的信号连接到该方法。然后您的 RadioGroup 变得简单(如果您想以某种方式显示它,继承自 QWidget 是一个好主意):

class MyRadioGroup(QWidget):
    def __init__(self, radioes=None):
        QWidget.__init__(self)
        self.radioes = radioes  # good idea to store a reference to it
        for radio in radioes:
            radio.checkSignal.connect(self.update)

    def update(self, value):
        print("Checked", value)

我会将整个文件粘贴在下面供您测试。在我的设置中(Python 2.7.8,PySide 1.2.2),这工作正常。

顺便说一句:我对你的台词感到困惑 self.checkSignal.emit(SIGNAL(self.__value))。这是什么SIGNAL?也许我错过了你的问题。


完整的示例文件:

import sys
from PySide import QtGui
from PySide import QtCore

class MyRadioButton(QtGui.QPushButton):
    checkSignal = QtCore.Signal(str)

    def __init__(self, text, value=None, label=None):
        QtGui.QPushButton.__init__(self, text)
        self.__value = value
        self.__checked = False
        self.setCheckable(True)
        self.clicked.connect(self.toggleCheck)

    def toggleCheck(self):
        if self.__checked == False:
                self.__checked = True
                self.checkSignal.emit(self.__value)
        else:
                self.__checked = False


class MyRadioGroup(QtGui.QWidget):
    def __init__(self, radios=None):
        QtGui.QWidget.__init__(self)
        self.radios = radios
        for radio in self.radios:
            radio.checkSignal.connect(self.update)

    def update(self, value):
        print("Checked", value)

app = QtGui.QApplication(sys.argv)

radio1 = MyRadioButton('Hello toto', value='toto')
radio2 = MyRadioButton('Hello titi', value='titi')
group = MyRadioGroup(radios=[radio1, radio2])

vbox = QtGui.QVBoxLayout()
vbox.addWidget(radio1)
vbox.addWidget(radio2)
vbox.addStretch(1)
group.setLayout(vbox)
group.resize(250, 150)
group.setWindowTitle('Signals')
group.show()

sys.exit(app.exec_())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2012-07-01
    • 2013-03-23
    • 2017-08-24
    相关资源
    最近更新 更多