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