Делаем PyQt QRadiobutton эксклюзивным для нескольких макетов

Я пытаюсь создать радиокнопки только с одним активным в любой момент времени. Я попытался использовать QButtonGroup и установить его Exclusive. Однако, похоже, это не работает. Мой код выглядит следующим образом:

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_()

Как сделать мои переключатели эксклюзивными и активными по одной, если они находятся в разных макетах, как показано в моем первом примере кода?


person Chris Aung    schedule 20.08.2018    source источник


Ответы (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()
person Mailerdaimon    schedule 20.08.2018
comment
Пожалуйста, дайте мне знать, если это сработало для вас, и отметьте ответ как принятый, если он действительно решил вашу проблему. - person Mailerdaimon; 20.08.2018