Python PyQt 中的单选按钮分组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14798058/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 12:28:21  来源:igfitidea点击:

grouping radio buttons in PyQt

pythonqt4pyqtpyqt4

提问by sudeepdino008

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

I am trying to group r0,r1 and ra,rb i.e. when r0 is checked, r1 should be unchecked with no effect on states of ra or rb. How can I achieve this? The code indicates what I have tried so far.

我试图将 r0,r1 和 ra,rb 分组,即当 r0 被选中时,r1 应该被取消选中,对 ra 或 rb 的状态没有影响。我怎样才能做到这一点?代码表明我到目前为止已经尝试过。

采纳答案by Mat

A QMainWindowprovides a layout already, you can't simply replace that with your own. Either inherit from a plain QWidget, or create a new widget and add the layout and buttons to that.

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

Your naming is confusing too, QButtonGroupisn't a layout. It doesn't actually provide any visible UI. If you need a UI element that groups buttons, you should look at QGroupBoxinstead.

您的命名也令人困惑,QButtonGroup不是布局。它实际上并不提供任何可见的 UI。如果您需要一个对按钮进行分组的 UI 元素,则应该查看QGroupBox

Here's a simple variation on what you have above:

这是您上述内容的简单变化:

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

回答by Mujeeb Ishaque

Grouping of radio buttons can be done by all containers. You don't necessarily need QGroupBox, you can use QFrame instead or a QTabWidget. Your choice. Here's a sample code.

所有容器都可以对单选按钮进行分组。您不一定需要 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)