我正在尝试为下面的图片创建一个基本的Qt解决方案:
(在帖子的底部,我已经包含了一个可用于生成小部件图形的嵌套字典,如果有人想使用它的话)
基本上,我需要某种小部件/小部件树可以......
起初我认为可能是QTreeWidget或QTreeView可以做到这一点,但我无法让这些类扩展到主窗口之外,如图所示。
我还尝试在QListWidget中使用QMenu和QMenuBar以及QMenu小部件。这些都没有产生好的结果。但我本可以创造错误的。
以下是我需要在Qt中显示的一些数据:
[
{
'name': 'foo',
'dependencies': [
{
'name': 'bar',
'dependencies': [],
},
{
'name': 'when',
'dependencies': [
{
'name': 'subitem',
'dependencies': [],
},
{
'name': 'will',
'dependencies': [
{
'name': 'it',
'dependencies': [
{
'name': 'end',
'dependencies': [],
'version': 8,
'latest': 10,
},
],
},
],
},
{
'name': 'another',
'dependencies': [],
},
],
},
{
'name': 'thing',
'dependencies': [],
},
],
},
{
'name': 'some_other_thing',
'dependencies': [],
},
{
'name': 'an_asset_with_data',
'dependencies': [],
},
{
'name': 'more_things',
'dependencies': [],
},
]
任何帮助都将不胜感激。
答案 0 :(得分:1)
我建议的解决方案是使用QListWidget
和QMenu
。
import sys
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QApplication, QListWidget, QListWidgetItem, QMenu
class MenuWidget(QListWidget):
DependenciesRole = Qt.UserRole
def __init__(self, items, parent=None):
QListWidget.__init__(self, parent)
for it in items:
name = it["name"]
dependencies = it["dependencies"]
it = QListWidgetItem(name)
self.addItem(it)
it.setData(MenuWidget.DependenciesRole, dependencies)
def mousePressEvent(self, event):
QListWidget.mousePressEvent(self, event)
it = self.itemAt(event.pos())
if it is not None:
dependencies = it.data(MenuWidget.DependenciesRole)
if dependencies:
menu = QMenu(self)
MenuWidget.add_submenu(menu, dependencies)
p = self.visualRect(self.indexAt(event.pos())).topRight()
menu.popup(self.mapToGlobal(p))
@staticmethod
def add_submenu(menu, items):
for it in items:
name = it["name"]
dependencies = it["dependencies"]
if dependencies:
mn = menu.addMenu(name)
MenuWidget.add_submenu(mn, dependencies)
else:
menu.addAction(name)
d = [
{
'name': 'foo',
'dependencies': [
{
'name': 'bar',
'dependencies': [],
},
{
'name': 'when',
'dependencies': [
{
'name': 'subitem',
'dependencies': [],
},
{
'name': 'will',
'dependencies': [
{
'name': 'it',
'dependencies': [
{
'name': 'end',
'dependencies': [],
'version': 8,
'latest': 10,
},
],
},
],
},
{
'name': 'another',
'dependencies': [],
},
],
},
{
'name': 'thing',
'dependencies': [],
},
],
},
{
'name': 'some_other_thing',
'dependencies': [],
},
{
'name': 'an_asset_with_data',
'dependencies': [],
},
{
'name': 'more_things',
'dependencies': [],
},
]
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MenuWidget(d)
w.show()
sys.exit(app.exec_())