制作一个延伸到其父窗口

时间:2018-04-11 21:59:07

标签: python pyqt pyside

我正在尝试为下面的图片创建一个基本的Qt解决方案:

enter image description here

(在帖子的底部,我已经包含了一个可用于生成小部件图形的嵌套字典,如果有人想使用它的话)

基本上,我需要某种小部件/小部件树可以......

  • 以递归方式弹出主窗口(如图所示)
  • 存储任意数据,以便我可以像给定图像中那样对它们进行不同的样式设置,或者为每个窗口小部件提供不同的操作/工具提示等。
  • 理想情况下,无论什么解决方案都应该使用某种View,以便我可以与其他类型的显示器共享模型

起初我认为可能是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': [],
    },
]

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我建议的解决方案是使用QListWidgetQMenu

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_())

enter image description here