<p>实际上,您可以使用<code>QGroupBox</code>,因为您已经可以使其可检查并在其中添加项。当选中groupbox的复选框时,它将禁用其任何内容。所以大部分框架已经存在了。唯一的问题不是复选框,而是希望它像<code>QRadioButton</code>一样工作,以便其他复选框禁用。我们可以用一些简单的逻辑来处理:</p>
<pre><code>from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets
class Win(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Win, self).__init__(parent)
self.resize(300, 0)
# 1st groupbox and spinbox.
self.spinbox1 = QtWidgets.QSpinBox()
self.group_layout1 = QtWidgets.QVBoxLayout()
self.group_layout1.addWidget(self.spinbox1)
self.groupbox1 = QtWidgets.QGroupBox("1")
self.groupbox1.setCheckable(True)
self.groupbox1.setLayout(self.group_layout1)
self.groupbox1.toggled.connect(self.on_groupbox_toggled)
# 2nd groupbox and spinbox.
self.spinbox2 = QtWidgets.QSpinBox()
self.group_layout2 = QtWidgets.QVBoxLayout()
self.group_layout2.addWidget(self.spinbox2)
self.groupbox2 = QtWidgets.QGroupBox("2")
self.groupbox2.setCheckable(True)
self.groupbox2.setChecked(False)
self.groupbox2.setLayout(self.group_layout2)
self.groupbox2.toggled.connect(self.on_groupbox_toggled)
self.main_layout = QtWidgets.QHBoxLayout()
self.main_layout.addWidget(self.groupbox1)
self.main_layout.addWidget(self.groupbox2)
self.setLayout(self.main_layout)
def on_groupbox_toggled(self, enabled):
# Force user to not be able to uncheck it.
if not enabled:
self.sender().setChecked(True)
# Block signals so this function doesn't get triggered by other groupbox.
self.groupbox1.blockSignals(True)
self.groupbox2.blockSignals(True)
# Check off other groupbox.
if self.sender() == self.groupbox1:
self.groupbox2.setChecked(False)
else:
self.groupbox1.setChecked(False)
# Restore signals.
self.groupbox1.blockSignals(False)
self.groupbox2.blockSignals(False)
win = Win()
win.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/WjlVH.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/WjlVH.jpg" alt="Example"/></a></p>