python - 创建堆叠的垂直子菜单,在单击时显示/隐藏小部件
问题描述
我想在 PyQt5 中创建一个用作“堆叠子菜单”的小部件:一旦用户单击特定标签/行,下面会出现一堆相关选项/小部件。这些子菜单可以堆叠在一起,如下面的示例所示(来自 LibreOffice Impress 的屏幕截图):
我想要的是
我目前的尝试如下:我正在使用一个QPushButton
负责显示/隐藏QFrame
包含任意小部件的组件。基本思想在这里,但这是一种“手动”方法。
到目前为止我得到了什么
编码
import sys
from PyQt5.QtWidgets import (QApplication, QFrame, QLabel, QPushButton,
QVBoxLayout, QWidget)
class MyApp(QWidget):
def __init__(self):
super().__init__(parent=None)
# Layout
layout = QVBoxLayout()
self.setLayout(layout)
# Row, widgets are placed in a frame below
self.row = QPushButton('Graphs')
layout.addWidget(self.row)
# Frame where widgets are placed
self.frame = QFrame()
layout.addWidget(self.frame)
# Add a layout and some widgets to the frame
self.frame.setLayout(QVBoxLayout())
self.frame.layout().addWidget(QLabel('Data 1'))
self.frame.layout().addWidget(QLabel('Data 2'))
self.frame.layout().addWidget(QPushButton('New Graph...'))
self.frame.setVisible(False)
# Show/hide frame when row is clicked
self.row.clicked.connect(self.toggle_frame)
def toggle_frame(self) -> None:
if self.frame.isVisible():
self.frame.setVisible(False)
else:
self.frame.setVisible(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = MyApp()
gui.show()
sys.exit(app.exec_())
也许 PyQt5 有创建这样一个子菜单的内置方法?我不知道如何称呼这样的设计,所以我很难寻找答案。我尝试弄乱 aQTreeWidget
但我找不到显示/隐藏树中所有元素的选项(并且将任意小部件/布局添加到 aQTreeWidget
似乎有点 hacky)。或者我的方法是要走的路,只是缺少一点样式/布局管理?
解决方案
推荐阅读
- android - 如何修复 java.lang.SecurityException 警告?
- android - Android TalkBack 反复说“服务 [我的应用名称]”
- javascript - 如何将数据传递到引导模式 django
- react-native - 未声明的基于商店的 React Navigation 导致警告
- javascript - 找到文本字段的特定id和类并document.write
- mysql - 错误:外键约束的格式不正确
- c# - 如何每 10 分钟在 datetime 上舍入分钟
- javascript - 仅加载图像/属性的大小,但不加载实际内容
- javascript - 为什么Vue没有初始化?
- ios - 仅在距当前位置 1 公里时列出数据库中所有位置的最佳方法?