【问题标题】:Custom context menu in QTreeViewQTreeView 中的自定义上下文菜单
【发布时间】:2016-06-06 03:23:44
【问题描述】:

我目前有这个对话框小部件:

class TaskTypeTreeEditor(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._view = QTreeView()
        self._view.setItemDelegate(TaskTypeNameDelegate())
        self._view.setContextMenuPolicy(Qt.CustomContextMenu)
        self._view.customContextMenuRequested.connect(self._open_menu)

        self._refresh()

        layout = QVBoxLayout()
        layout.addWidget(self._view)

        self.setLayout(layout)
        self.setWindowTitle(_('Admin.editTaskType'))

    def _open_menu(self, position):
        indexes = self._view.selectedIndexes()
        if len(indexes) == 0:
            return

        menu = QMenu()
        ids = [index.internalPointer().type_id for index in indexes]

        if len(indexes) == 1:
            NewTypeAction(ids[0], self._refresh, menu)

        DeleteTypeAction(ids, self._refresh, menu)

        menu.exec_(self._view.viewport().mapToGlobal(position))

    def _refresh(self):
        model = TaskTypeTreeModel()
        self._view.setModel(model)
        self._view.expandAll()

这是基于 Python wiki 的另一个设计。假设NewTypeAction 和DeleteTypeAction 是QAction 的子类,并且它们的构造函数适当地使用menu 的父类调用QAction.__init__,为什么当我在视图中右键单击时没有出现菜单?

【问题讨论】:

  • 有根据的猜测:因为indexes 是空的?
  • @ekhumoro 不。我做了一个快速测试,它正在继续执行。尽管我在创建动作时传递了父级,但看起来它实际上是在制作一个空白菜单。我可以说,因为右键单击后我的下一次单击被忽略;我以前没有注意到。
  • 好吧,既然没有其他人可以看到相关代码,我想剩下的调试工作由你来完成;-)

标签: python pyqt pyqt4 contextmenu qtreeview


【解决方案1】:

想通了。我忘了打电话给menu.addAction 我的两个新动作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多