【问题标题】:Getting pyqt application focus for popup menu to disappear when clicking away from it当单击远离它时,使弹出菜单的 pyqt 应用程序焦点消失
【发布时间】:2016-07-20 21:05:54
【问题描述】:

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

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

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

我已经尝试了我能想到的一切。这是一个列表:

  • 使用 QtGui.qApp.installEventFilter(menu) 来尝试捕捉鼠标按下的信号。它永远不会被触发。我怀疑应用程序本身没有收到点击。
  • 使用 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 比较陌生,很可能错过了一些东西。

非常感谢, 安迪

【问题讨论】:

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

标签: menu focus pyqt


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2011-07-09
    • 2014-08-25
    相关资源
    最近更新 更多