python - 如何将级联菜单添加到 QCheckBox
问题描述
我只是想知道如何在 Pyqt 中通过 QCheckBOx 添加级联菜单,以便对于每个选择,我都可以展开并获得更多选项。这是我下面的代码,
class Example (QWidget):
def __init__(self, fname):
self.fname=fname
super().__init__()
self.initUI()
def initUI(self):
self.sheets= list(fname.keys())
print(self.sheets)
self.cb1 = QCheckBox("Hello", self)
self.cb2 = QCheckBox("You", self)
self.cb3 = QCheckBox("Are", self)
self.cb4 = QCheckBox("My", self)
self.cb5 = QCheckBox("Sunshine", self)
self.resize(300,400)
self.setWindowTitle('QCheckBox')
formLayout = QFormLayout()
groupBox = QGroupBox("This Is Group Box")
formLayout.addRow(self.cb1)
formLayout.addRow(self.cb2)
formLayout.addRow(self.cb3)
formLayout.addRow(self.cb4)
formLayout.addRow(self.cb5)
所以我有5个选择框,
但是现在对于我想要添加级联菜单的每个框,就像下面的图片所示
解决方案
基于您想要的内容已经在eyllanesc 的示例中呈现的假设,但带有复选框,这里是此代码的一个版本,带有复选框且没有动画:
from PyQt5 import QtWidgets
class CollapsibleBox(QtWidgets.QWidget):
def __init__(self, title=""):
super().__init__()
self.toggle_button = QtWidgets.QCheckBox(text=title)
self.toggle_button.clicked.connect(self.on_clicked)
self.content_area = QtWidgets.QScrollArea(maximumHeight=0, minimumHeight=0)
self.content_area.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
self.content_area.setFrameShape(QtWidgets.QFrame.NoFrame)
lay = QtWidgets.QVBoxLayout(self)
lay.setSpacing(0)
lay.setContentsMargins(0, 0, 0, 0)
lay.addWidget(self.toggle_button)
lay.addWidget(self.content_area)
def on_clicked(self):
# this is a bit hacky, I just expand the boxes to a max. size of 1000, which should fit most needs
self.content_area.setMaximumHeight(self.toggle_button.isChecked() * 1000)
class MainUI(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
vlay = QtWidgets.QVBoxLayout()
for i in range(3):
# add checkboxes and fully collapsed layouts (containing only labels for demo)
box = CollapsibleBox(f"Collapsible Box {i+1}")
vlay.addWidget(box)
lay = QtWidgets.QVBoxLayout()
# add items to the collapsed layout
for j in range(5):
label = QtWidgets.QLabel("demo")
lay.addWidget(label)
box.content_area.setLayout(lay)
vlay.addStretch()
widget = QtWidgets.QWidget()
widget.setLayout(vlay)
self.setCentralWidget(widget)
if __name__ == "__main__":
app = QtWidgets.QApplication([])
w = MainUI()
w.show()
app.exec_()
推荐阅读
- javascript - 学习如何创建搜索菜单来过滤链接
- java - Spring MVC:使用 Test WebApplicationContext 和嵌入式 Jetty 进行 UI 测试
- r - 如何为数据框中的事件分配特定值?
- google-sheets - 查找多重匹配和求和结果
- android - Sonarqube 未启动,退出代码 [es]:1
- python - 尝试安装 deezer 的 AI "spleeter"
- scala - Apache Spark 聚合:基于另一列值聚合列
- vue.js - Vuejs - 如何通过名称获取路径的路径?
- ios - 构建命令失败:CompileAssetCatalog - 适用于 iOS 的 Cordova
- kubernetes - Istio 出口流量不通过 istio istio-proxy sidecar 路由