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

可单击QMenu触发的事件不工作-python,python,pyside,Python,Pyside,你会在下面的图片中看到,我想制作它,这样用户可以点击Laura(这是一个QMenu),它就会触发事件。就像一次常规的行动一样 我正在根据下面的层次结构动态创建子菜单。然而,我希望所有的子菜单都可以点击,除了“孩子们” 奇怪的是“悬停”事件触发,而不是触发事件?为什么会这样 #!/usr/bin/python # -*- coding: utf-8 -*- # Imports # ----------------------------------------------------------

你会在下面的图片中看到,我想制作它,这样用户可以点击Laura(这是一个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)

文件中提到的
触发的
信号:

注意:此信号是为层次结构中的主父菜单发出的。因此,只有父菜单需要连接到插槽;子菜单不需要连接

我想这是因为用户界面的惯例是,点击子菜单什么都不做:它们在悬停状态下打开,除了打开之外,什么都不能做。你想要的行为是不寻常的,我认为如果你需要
触发的
信号,就需要对
QMenu
进行分类

您可以尝试连接到
aboutToShow
信号


另一种选择是向表示父子菜单操作的每个子菜单添加某种“.”操作。
QMenu
文档称触发的
信号:

注意:此信号是为层次结构中的主父菜单发出的。因此,只有父菜单需要连接到插槽;子菜单不需要连接

我想这是因为用户界面的惯例是,点击子菜单什么都不做:它们在悬停状态下打开,除了打开之外,什么都不能做。你想要的行为是不寻常的,我认为如果你需要
触发的
信号,就需要对
QMenu
进行分类

您可以尝试连接到
aboutToShow
信号

另一种选择是向表示父子菜单操作的每个子菜单添加某种“.”操作