Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义信号在PySide中不工作_Python_Pyside - Fatal编程技术网

Python 自定义信号在PySide中不工作

Python 自定义信号在PySide中不工作,python,pyside,Python,Pyside,我是PySide的新手,我正试图发出一个信号并从另一个类接收它 我在MySignal类的对象上使用了emit,信号是从MyRadioButton类发出的。emit和connect都返回True,但正如我所希望的,没有调用update方法 这是文件和代码的基本结构 # MySignals.py from PySide.QtCore import QObject, Signal class MyCheckedSignal(QObject): signal = Signal(str) #

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

我在MySignal类的对象上使用了emit,信号是从MyRadioButton类发出的。emit和connect都返回True,但正如我所希望的,没有调用update方法

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

# 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)
前言:您对基类的选择似乎很奇怪:您的
MyRadioButton
应该继承自,而您的
MyRadioGroup
将受益于继承自,这是一个合适的小部件,因此将与应用程序的其余部分很好地集成。查看内部描述,了解布局的具体示例

对于您的特定问题,如果不使用现有的
QRadioButton
,则不需要为信号创建特殊类。只需声明您的
MyRadioButton
,如下所示:

class MyRadioButton(QPushButton):
checkSignal=QtCore.Signal(str)
定义初始化(self,value=None,label=None):
QPushButton.\uuuuu初始化\uuuuuuuu(自)
自我价值=价值
self.\uuu checked=False
self.setCheckable(True)#单击后将“保持”按钮
self.clicked.connect(self.toggleCheck)#单击时发出的信号
def切换检查(自检):
如果self.\uuu checked==False:
self.\uuu checked=True
self.checkSignal.emit(self.\u值)
其他:
self.\uuu checked=False
请注意,要激活
toggleCheck
方法,必须将
QAbstractButton
单击的
信号连接到该方法。然后,您的RadioGroup变得简单(如果您想以某种方式显示它,从QWidget继承是一个好主意):

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

旁白:我被你的台词弄糊涂了
self.checkSignal.emit(信号(self.\uu值))
。这是什么信号?也许我从你的问题中漏掉了什么


完整示例文件:

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_())

这是真代码吗?看起来很奇怪。为了发出信号,
self.\u值
必须是
“信号(QString)”
。此外,信号必须只发送一个字符串参数,否则将引发
类型错误
。因此,如果您说
connect
emit
都返回
True
,那么您发布的代码并不准确地表示您的真实代码。
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_())