Создание PyQt QRadiobutton для нескольких макетов эксклюзивно
Я пытаюсь создать радиокнопки, в которых одновременно активна только одна. Я попытался использовать QButtonGroup и установить его Эксклюзивно. Однако это не похоже на работу. Мой код, как показано ниже:
from PyQt4 import QtGui, QtCore
import sys
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
button_group = QtGui.QButtonGroup()
data_list = ['apple', 'orange', 'banana', 'mango']
main_widget = QtGui.QWidget()
main_widget_layout = QtGui.QVBoxLayout()
main_widget.setLayout(main_widget_layout)
for item in data_list:
radio_button = QtGui.QRadioButton()
button_group.addButton(radio_button)
item_label = QtGui.QLabel(item)
mini_widget = QtGui.QWidget()
mini_widget_layout = QtGui.QHBoxLayout()
mini_widget_layout.addWidget(radio_button)
mini_widget_layout.addWidget(item_label)
mini_widget_layout.addStretch(True)
mini_widget.setLayout(mini_widget_layout)
main_widget_layout.addWidget(mini_widget)
button_group.setExclusive(True)
self.setCentralWidget(main_widget)
self.show()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_window = Window()
main_window.show()
app.exec_()
Однако, когда я попытался добавить те же переключатели на одну раскладку, как показано ниже, переключатели являются эксклюзивными и активными только по одной за раз.
from PyQt4 import QtGui, QtCore
import sys
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
data_list = ['apple', 'orange', 'banana', 'mango']
main_widget = QtGui.QWidget()
main_widget_layout = QtGui.QFormLayout()
for item in data_list:
radio_button = QtGui.QRadioButton()
main_widget_layout.addRow(radio_button,QtGui.QLabel(item))
main_widget.setLayout(main_widget_layout)
self.setCentralWidget(main_widget)
self.show()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_window = Window()
main_window.show()
app.exec_()
Как сделать мои переключатели эксклюзивными и активными по одной за раз, если они находятся в разных макетах, как показано в моем первом примере кода?
1 ответ
Вы делаете только временный ButtonGroup
который разрушается в конце __init__
, Сделать ButtonGroup
член вашего класса, чтобы это исправить. Вызов button_group.setExclusive(True)
не требуется, так как это уже по умолчанию для ButtonGroup
, Я также проверяю первую кнопку явно, потому что в противном случае ButtonGroup
находится в неизвестном состоянии.
Фиксированный код:
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.button_group = QtGui.QButtonGroup()
data_list = ['apple', 'orange', 'banana', 'mango']
main_widget = QtGui.QWidget()
main_widget_layout = QtGui.QVBoxLayout()
main_widget.setLayout(main_widget_layout)
first = True
for item in data_list:
radio_button = QtGui.QRadioButton()
if first:
radio_button.setChecked(True)
first = False
self.button_group.addButton(radio_button)
item_label = QtGui.QLabel(item)
mini_widget = QtGui.QWidget()
mini_widget_layout = QtGui.QHBoxLayout()
mini_widget_layout.addWidget(radio_button)
mini_widget_layout.addWidget(item_label)
mini_widget_layout.addStretch(True)
mini_widget.setLayout(mini_widget_layout)
main_widget_layout.addWidget(mini_widget)
self.setCentralWidget(main_widget)
self.show()