2015-07-06 2 views
0

Я создал QWidget подкласс под названием RadioSpinButton, в приложении Python с PyQt4, он состоит из QRadioButton рядом с QSpinBox. Я использую экземпляр RadioSpinButton внутри горизонтального макета с двумя экземплярами QRadioButton. QRadioButton внутри нового класса имеет один и тот же родительский адрес двух других QRadioButtons, но его свойство autoExclusive не работает. Как я могу решить эту проблему? Мне нужно только одна кнопка проверяется, но у меня есть это:PyQt4: QRadioButton внутри подкласса QWidget с autoexclusive собственности

enter image description here

enter image description here

Код

from PyQt4 import QtCore, QtGui 

class NewProject(QtGui.QWizard): 
    def __init__(self, parent=None): 
     super(NewProject, self).__init__(parent) 

     # Iniciando páginas 
     self.init_filepage() 

     # Tamaño mínimo de la ventana 
     #self.setMinimumSize(800, 600) 

     # Título 
     self.setWindowTitle(self.tr('Nuevo Proyecto')) 

    def init_filepage(self): 
     # Página para selección de imágenes 
     self.addPage(FilesPage(self))  

class FilesPage(QtGui.QWizardPage): 
    def __init__(self, parent=None): 
     super(FilesPage, self).__init__(parent) 

     # Título de la página 
     self.setTitle(self.tr('Imagen')) 
     self.setSubTitle(self.tr('Seleccione la escena alrededor de la cual se construirá el proyecto.')) 
     #self.setPixmap(QtGui.QWizard.LogoPixmap, QtGui.QPixmap(":/app-icon.svg").scaledToHeight(48)) 

     # Elementos 
     # Tipo de imagen según la cantidad de bandas 
     imgtype = QtGui.QGroupBox(self.tr('Tipo de imagen (cantidad de bandas):')) 
     imgtypelayout = QtGui.QHBoxLayout() 

     imgPANtype = QtGui.QRadioButton(self.tr('PAN (1 banda)'), self) 
     imgtypelayout.addWidget(imgPANtype) 

     imgMSStype = QtGui.QRadioButton(self.tr('MSS (4 bandas)'), self) 
     imgtypelayout.addWidget(imgMSStype) 

     imgVartype = RadioSpinButton(self.tr('Variable'), self) 
     imgtypelayout.addWidget(imgVartype) 

     imgtype.setLayout(imgtypelayout) 

     # Disposición principal 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(imgtype) 

     self.setLayout(layout)  

class RadioSpinButton(QtGui.QWidget): 
    def __init__(self, text, parent=None): 
     super(RadioSpinButton, self).__init__(parent) 

     # Radiobutton 
     self.button = QtGui.QRadioButton(text, parent) 
     self.button.toggled.connect(self.change_spinbox) 

     # Spinbox 
     self.spinbox = QtGui.QSpinBox() 
     self.spinbox.setEnabled(False) 

     # Disposición 
     layout = QtGui.QHBoxLayout() 
     layout.addWidget(self.button) 
     layout.addWidget(self.spinbox) 
     self.setLayout(layout) 

    @QtCore.pyqtSlot() 
    def change_spinbox(self): 
     self.spinbox.setEnabled(not self.spinbox.isEnabled()) 

Является ли это правильный способ проектировать RadioSpinButton подкласс?

ответ

0

Поскольку все ваши QRadioButtons не имеют одного и того же прямого родительского виджета, я считаю, что вам понадобится использовать QButtonGroup: http://doc.qt.io/qt-4.8/qbuttongroup.html.

+0

Я проверил, что у них один и тот же родительский виджет. :( – osjerick

+0

Ну, они явно не так? QRadioButton с spinner является дочерью RadioSpinButton. Я понимаю, что QRadioButtons должен иметь * точный * тот же самый родитель, чтобы исключительность работала правильно. В противном случае используйте QButtonGroup. - Я вижу, что вы устанавливаете родительский элемент QRadioButton в своем конструкторе. Проверяете ли вы, что это все еще так, после того, как вы добавили их в макет и задали макет? Независимо от того, QButtonGroup должен его исправить. –

+0

Хорошо, спасибо! Но почему это происходит ?: Если я пишу 'print imgMSStype.parent()' и 'print imgMSStype.parent()' - это правильные места, результатом обоих является ' и' 'соответственно. Фактически, если сначала проверяется RadioSpinButton, а затем вы проверяете один из другого, он будет переключаться всего один раз (первый раз). – osjerick

Смежные вопросы