Menu 使pyqt应用程序焦点在单击弹出菜单时消失

Menu 使pyqt应用程序焦点在单击弹出菜单时消失,menu,focus,pyqt,Menu,Focus,Pyqt,让我快速解释一下这方面的背景。我正在一个名为Softimage XSI的3D应用程序中开发一个自定义菜单系统。它已经创建了一个PyQt应用程序对象,并且每秒调用ProcessEvents一定次数,以便PyQt应用程序可以在XSI中以非模态状态存在 为了实现这个菜单,我在工具栏中嵌入了一个网页,它调用了一个XSI插件,我编写这个插件是为了显示PyQt菜单。这一切都很好(尽管有点做作!) 问题是,当我显示菜单时,当我离开它时,它不会消失。如果我将鼠标移到菜单上,然后单击远离菜单,它将消失。只有当它第

让我快速解释一下这方面的背景。我正在一个名为Softimage XSI的3D应用程序中开发一个自定义菜单系统。它已经创建了一个PyQt应用程序对象,并且每秒调用ProcessEvents一定次数,以便PyQt应用程序可以在XSI中以非模态状态存在

为了实现这个菜单,我在工具栏中嵌入了一个网页,它调用了一个XSI插件,我编写这个插件是为了显示PyQt菜单。这一切都很好(尽管有点做作!)

问题是,当我显示菜单时,当我离开它时,它不会消失。如果我将鼠标移到菜单上,然后单击远离菜单,它将消失。只有当它第一次出现的时候

我已经尝试了我能想到的一切。以下是一份清单:

  • 使用QtGui.qApp.installEventFilter(菜单)尝试捕捉鼠标按下的信号。它永远不会被触发。我怀疑应用程序本身没有收到点击
  • 使用菜单。升高(没有区别
  • QtGui.qApp.setActiveWindow(菜单)
  • 菜单。设置焦点()
  • 我也试过:

    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比较陌生,可能错过了一些东西

非常感谢,,
Andy

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

我也有类似的问题。你做了什么来解决这个问题?奇怪的是,grabMouse提供了同样的部分成功,但显然不是正确的方法。不幸的是,我从来没有这样做过。我很想听听你是否能找到解决的办法,只是想办法。在我调用self.trayMenu.popup(QtGui.QCursor.pos())弹出系统托盘菜单之前,我调用self.trayMenu.activateWindow()。将activateWindow置于弹出窗口之前会使左键单击菜单与右键单击菜单的工作方式相同,并且当您单击其他位置时,它会消失。:)