让我快速解释一下背景。我正在开发一个名为 Softimage XSI 的 3D 应用程序中的自定义菜单系统。它已经创建了一个 PyQt 应用程序对象,并且 ProcessEvents 每秒被调用一定次数,以便 PyQt 应用程序可以在 XSI 中以非模态状态存在。
为了实现菜单,我在工具栏中嵌入了一个网页,该网页正在调用我编写的用于显示 PyQt 菜单的 XSI 插件。这一切都很好(尽管有点做作!)。
问题是当我显示菜单时,当我点击离开它时它不会消失。如果我将鼠标移到菜单上,然后单击它,它就会消失。只有当它第一次弹出时。
我已经尝试了我能想到的一切。这是一个列表:
- 使用QtGui.qApp.installEventFilter(menu)来尝试捕捉 mousepressed 信号。它永远不会被触发。我怀疑应用程序本身没有收到点击。
- 使用menu.raise_()没有区别
- QtGui.qApp.setActiveWindow(menu)也没有
- 或menu.setFocus()
我也试过:
event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove, pos, QtCore.Qt.NoButton, QtCore.Qt.NoButton, QtCore.Qt.NoModifier) QtGui.qApp.sendEvent(menu, event)
我曾尝试编写自己的 QEventLoop,但它刚刚使 XSI 崩溃。我怀疑尝试在另一个内部运行模态循环可能不是合法的事情。要么,要么我真的不知道我在做什么(同样可能)
我唯一取得部分成功的是使用grabMouse()。如果我从菜单上单击(仅在鼠标经过菜单一次之后),这就是使菜单关闭的原因,但是我必须调用它几次才能“粘住”。
所以这是我目前的代码:
class MyMenu (QtGui.QMenu):
def __init__(self, parent = None):
QtGui.QMenu.__init__(self, parent)
self.grabbed=2
def getMouse(self):
if self.grabbed>0:
self.grabMouse()
self.grabbed-=1
def paintEvent(self, event):
QtGui.QMenu.paintEvent(self, event)
self.getMouse()
def hideEvent(self, event):
self.releaseMouse()
def ShowMenu():
menu = MyMenu()
menu.addAction("A")
menu.addAction("B")
menu.addAction("C")
submenu = MyMenu()
submenu.addAction("D")
submenu.addAction("E")
submenu.addAction("F")
menu.addMenu(submenu)
menu.setTearOffEnabled(True)
menu.setStyleSheet("font: 8pt \"Sans Serif\";")
submenu.setStyleSheet("font: 8pt \"Sans Serif\";")
submenu.setTitle("Window")
submenu.setTearOffEnabled(True)
pos = QtGui.QCursor.pos()
pos.setX(105)
menu.popup(pos)
#Prevent garbage collection
QtGui.XSIMenu=menu
QtGui.XSISubMenu=submenu
#Desperate acts!
menu.raise_()
QtGui.qApp.setActiveWindow(menu)
menu.setFocus()
任何想法或随机建议都将非常感激地收到,因为这让我发疯!不要害怕对我已经尝试过的东西提出修改建议,因为我对 PyQt 相对较新,我很可能错过了一些东西。
非常感谢,安迪