可单击QMenu触发的事件python不工作

2024-10-03 00:23:13 发布

您现在位置:Python中文网/ 问答频道 /正文

你会看到在下面的图片,我想让用户可以点击劳拉(这是一个QMenu)和它的火灾和事件。就像一个正常的行动。在

我根据下面看到的层次结构动态地创建子菜单。不过,我希望所有的子菜单都可以点击,除了'孩子'。在

奇怪的是“悬停”事件触发而不是触发器事件?为什么会这样?在

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Imports
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore

# Main Widget
# ------------------------------------------------------------------------------
class ExampleWidget(QtGui.QWidget):

    def __init__(self,):
        super(ExampleWidget, self).__init__()
        self.initUI()

    def initUI(self):
        # formatting
        self.setWindowTitle("Example")

        # context menu
        self.main_menu = QtGui.QMenu()
        self.sub_menu = QtGui.QMenu("Kids")
        self.main_menu.addMenu(self.sub_menu)

        tree = [
            {
                "parent" : "Chris",
                "children" : [
                    {
                        "parent" : "Doug",
                        "children" : []
                    },
                    {
                        "parent" : "Michelle",
                        "children" : [
                            {
                                "parent" : "Susan",
                                "children" : []
                            }
                        ]
                    }
                ]
            },
            {
                "parent" : "Laura",
                "children" : [
                    {
                        "parent" : "Michael",
                        "children" : []
                    }
                ]
            }
        ]

        self.build_sub_menu( self.sub_menu, tree )

        # widgets        
        self.factionsList = QtGui.QListWidget()
        # signal
        self.factionsList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.factionsList.customContextMenuRequested.connect(self.on_context_menu_factions)
        # layout
        self.mainLayout = QtGui.QGridLayout(self)
        self.mainLayout.addWidget(self.factionsList, 1, 0)
        self.show()

    def add_menu_item(self, menu, branch):
        parent = branch["parent"]
        sub_menu = QtGui.QMenu(parent)
        item = menu.addMenu(sub_menu)
        item.triggered.connect(self.menu_action)
        item.hovered.connect(self.menu_action)
        print item

        for c in branch["children"]:
            self.add_menu_item( sub_menu, c)

    def build_sub_menu(self, menu, tree):
        for branch in tree:
            self.add_menu_item(menu, branch)

    def menu_action(self):
        print "Event"
        print self.sender().text()

    def on_context_menu_factions(self, pos):
        self.main_menu.exec_( QtGui.QCursor.pos() )

# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    ex = ExampleWidget()
    res = app.exec_()
    sys.exit(res)

enter image description here


Tags: selfbranchtreemaindefsys事件item
1条回答
网友
1楼 · 发布于 2024-10-03 00:23:13

QMenu文档描述了triggered信号:

Note: This signal is emitted for the main parent menu in a hierarchy. Hence, only the parent menu needs to be connected to a slot; sub-menus need not be connected

我想这是因为在UI中,点击子菜单什么都不做:它们在鼠标悬停时打开,除了打开之外什么都不能做。你想要的行为是不寻常的,我认为如果你需要triggered信号的话,就需要对QMenu进行子分类。在

您可以尝试连接到aboutToShow信号。在

另一种选择是在每个代表父子菜单操作的子菜单中添加某种“.”操作。在

相关问题 更多 >