自定义信号在 PySide 中不起作用
Custom signal not working in PySide
我是 PySide 的新手,我正在尝试发出信号并从另一个 class 接收信号。
我在 MySignal class 的对象上使用了 emit 并且信号从 MyRadioButton class 发出。 emit 和 connect 都返回 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)
前言:您选择的基础 class 看起来很奇怪:您的 MyRadioButton
应该继承自 QRadioButton and your MyRadioGroup
would benefit inheriting from QGroupBox,这是一个合适的小部件,因此将集成以及应用程序的其余部分。查看里面的描述,获取带有布局的具体示例。
对于您的具体问题,在不使用现有 QRadioButton
的情况下,您不需要为信号创建特殊的 class。只需声明您的 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_())
我是 PySide 的新手,我正在尝试发出信号并从另一个 class 接收信号。
我在 MySignal class 的对象上使用了 emit 并且信号从 MyRadioButton class 发出。 emit 和 connect 都返回 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)
前言:您选择的基础 class 看起来很奇怪:您的 MyRadioButton
应该继承自 QRadioButton and your MyRadioGroup
would benefit inheriting from QGroupBox,这是一个合适的小部件,因此将集成以及应用程序的其余部分。查看里面的描述,获取带有布局的具体示例。
对于您的具体问题,在不使用现有 QRadioButton
的情况下,您不需要为信号创建特殊的 class。只需声明您的 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_())