在PyQt中分组单选按钮
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 个回答
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)
18
一个 QMainWindow
已经有了自己的布局,你不能简单地用自己的布局替换掉它。你可以选择从一个普通的 QWidget
继承,或者创建一个新的小部件,然后把布局和按钮添加到那个小部件里。
另外,你的命名也有点让人困惑,QButtonGroup
其实不是一个布局。它并不会提供任何可见的用户界面。如果你需要一个可以把按钮分组的界面元素,应该看看 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()