1

让我快速解释一下背景。我正在开发一个名为 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 相对较新,我很可能错过了一些东西。

非常感谢,安迪

4

1 回答 1

0

就在使用 self.trayMenu.popup(QtGui.QCursor.pos()) 调用 popup 之前,调用 self.trayMenu.activateWindow()。在弹出之前放置 activateWindow 使左键单击菜单与右键单击菜单的工作方式相同,并且当您单击其他位置时它会消失。:)

于 2016-07-20T13:05:54.580 回答