2015-07-04 2 views
2

Я новичок в PySide, и я пытаюсь испустить сигнал и получить его из другого класса.Пользовательский сигнал не работает в PySide

Я использовал излучение на объекте класса MySignal, и сигнал излучается из класса 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) 
+0

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

ответ

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_()) 
Смежные вопросы