grouping radio buttons in PyQt

34,460

Solution 1

A QMainWindow provides 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.

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

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

Solution 2

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.

    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)
Share:
34,460
sudeepdino008
Author by

sudeepdino008

Here to learn

Updated on July 09, 2022

Comments

  • sudeepdino008
    sudeepdino008 almost 2 years
    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.

  • Karel Bílek
    Karel Bílek almost 11 years
    Hello. Sorry for resurrectind 3 years old answer, but can you please add example how to use QGroupBox too? I cannot find any example with QGroupBox and the documentation is hard to understand
  • chwi
    chwi over 8 years
    @KarelBílek yeh, me too.