Предисловие: Ваш выбор базового класса кажется странным: ваш 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_())
Является ли это реальный код? Это выглядит очень странно. Для того, чтобы сигнал был испущен, значение «self .__» должно было бы быть «сигналом» (QString) ». Кроме того, сигнал ** должен ** отправлять ровно один строковый параметр, иначе он поднимет 'TypeError'. Поэтому, если вы говорите, что 'connect' и' emit' возвращают 'True', то код, который вы опубликовали, не точно отражает ваш реальный код. – ekhumoro