在PyQt中对单选按钮进行分组

9
import sys
from PyQt4 import QtCore, QtGui

class Class1(QtGui.QMainWindow):
    def __init__(self):
        super(Class1, self).__init__()
        self.func()

    def func(self):

        r0=QtGui.QRadioButton("0",self)
        r1=QtGui.QRadioButton("1",self)
        ra=QtGui.QRadioButton("a",self)
        rb=QtGui.QRadioButton("b",self)
        r0.move(100,100)
        r1.move(400,100)
        ra.move(100,400)
        rb.move(400,400)
        number_layout=QtGui.QButtonGroup()
        letter_layout=QtGui.QButtonGroup()
        number_layout.addButton(r0)
        number_layout.addButton(r1)
        letter_layout.addButton(ra)
        letter_layout.addButton(rb)
        layout=QtGui.QHBoxLayout(self)
        self.show()




def main():
    app = QtGui.QApplication(sys.argv)
    mw = Class1()
    mw.show()
    sys.exit(app.exec_())


if __name__=='__main__':
    main()

我想将r0、r1和ra、rb分组,即当选中r0时,应取消选中r1,而不会对ra或rb的状态产生影响。我该如何实现这一点?代码显示了我目前尝试过的内容。

2个回答

18

QMainWindow已经提供了一个布局,你不能简单地用自己的布局替换它。要么继承一个普通的QWidget,要么创建一个新的小部件并将布局和按钮添加到其中。

你的命名也很令人困惑,QButtonGroup不是布局。它实际上并没有提供任何可见的UI界面。如果你需要一个用来分组按钮的UI元素,应该看看QGroupBox

这里是一个简单的变化,基于你上面的代码:

def func(self):
    layout=QtGui.QHBoxLayout()  # layout for the central widget
    widget=QtGui.QWidget(self)  # central widget
    widget.setLayout(layout)

    number_group=QtGui.QButtonGroup(widget) # Number group
    r0=QtGui.QRadioButton("0")
    number_group.addButton(r0)
    r1=QtGui.QRadioButton("1")
    number_group.addButton(r1)
    layout.addWidget(r0)
    layout.addWidget(r1)

    letter_group=QtGui.QButtonGroup(widget) # Letter group
    ra=QtGui.QRadioButton("a")
    letter_group.addButton(ra)
    rb=QtGui.QRadioButton("b")
    letter_group.addButton(rb)
    layout.addWidget(ra)
    layout.addWidget(rb)

    # assign the widget to the main window
    self.setCentralWidget(widget)
    self.show()

2
你好。很抱歉挖掘了三年前的答案,但是你能否请添加如何使用QGroupBox的示例呢?我找不到任何带有QGroupBox的示例,并且文档很难理解。 - Karel Bílek
1
@KarelBílek 是的,我也是。 - chwi

1

所有容器都可以进行单选按钮的分组。您不一定需要使用QGroupBox,可以使用QFrame或QTabWidget。取决于您的选择。以下是示例代码。

    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
    self.frame_1       = QtWidgets.QFrame(self.layoutWidget1)
    self.radio_btn_a   = QtWidgets.QRadioButton(self.frame_1)
    self.radio_btn_a.setGeometry(QtCore.QRect(160, 80, 40, 17))
    self.radio_btn_a.setObjectName("radio_btn_a")
    MainWindow.setCentralWidget(self.centralwidget)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接