QStatusBar 消息在菜单悬停时消失

Posted

技术标签:

【中文标题】QStatusBar 消息在菜单悬停时消失【英文标题】:QStatusBar message disappears on menu hover 【发布时间】:2014-07-11 10:04:50 【问题描述】:

我有一个非常基本的QMainWindow 应用程序,其中包含一个menubar 和一个statusbar。当我将鼠标悬停在菜单上时,状态消息消失。更准确地说,清除状态消息。我不知道是什么导致了这种行为,但它导致了我希望是微不足道的行为的非常困难的解决方法。

这是有问题的,原因如下: 我可以通过将QLabel 小部件添加到QStatusBar 来使消息永久化,但随后我得到了尴尬的边框。我不想要边界。我知道如何删除边框的唯一方法是通过QStatusBar.setStyleSheet()。我正在为我的配色方案使用调色板而不是样式表,因此修改样式表会弄乱其他颜色。当我通过样式表进行修改时,我也无法恢复原始的statusBar QLabel 颜色。我不擅长使用样式表。

有没有办法防止菜单交互清除状态消息?如果没有,有没有办法在添加 QLabel 小部件时从状态栏中删除边框,同时保留我的调色板(可能不是通过样式表)?

#!/usr/bin/env python
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class win(QMainWindow):
    def __init__(self,parent=None):
        super(win,self).__init__(parent)
        self.menubar = QMenuBar(self)
        self.fileMenu  = QMenu("File")
        self.exitAction = QAction("Exit",self)
        self.fileMenu.addAction(self.exitAction)
        self.menubar.addMenu(self.fileMenu)   
        self.statusBar().showMessage("Hello")
        self.connect(self.exitAction,SIGNAL("triggered()"), self.close)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    GUI = win()
    GUI.show()
    app.exec_()

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我找到了另一种创建新 QLabel 的方法

self.myMessage = QtGui.QLabel()
self.myMessage.setText("Hello")

并将其作为小部件添加到左侧的状态栏

self.statusBar.addWidget(self.myMessage)

或在右边

self.statusBar.addPermanentWidget(self.myMessage)

【讨论】:

【参考方案2】:

只是为了更新 Lazywii 关于使用 QLabel 的答案。该代码并没有完全按原样工作,因此自 2016 年以来可能发生了一些变化,但在 2020 年在 PyQt5 上起作用的是:

    self.myMessage = QtWidgets.QLabel()
    self.myMessage.setText("My message not affected by tooltips from hovering")

    self.statusbar.addWidget(self.myMessage)

【讨论】:

【参考方案3】:

基本上,您将鼠标悬停的每个小部件都会将状态栏文本设置为其statusTip 属性,即使该属性为空字符串也是如此。

对于QMenu,文本存储在menuAction 操作状态提示中,因此,您可以使用文本而不是像这样清除状态栏:

self.fileMenu.menuAction().setStatusTip("File Menu is hovered")

为了防止任何东西改变状态栏,你可能可以在状态栏上安装一个eventFilter并过滤掉所有QStatusTipEvent

【讨论】:

这是 QMainWindows 特有的吗?当我使用带有 QDialog 的状态栏时,我没有注意到这种行为。我没有菜单,所以也许这就是原因。 @user1054424 是的,它是特定的。 QStatusTipEvent 甚至对于 QDialog 中的悬停小部件也会发送,但默认情况下它不会被任何处理。【参考方案4】:

一个完整的例子

# Created by BaiJiFeiLong@gmail.com at 2022/2/15 22:27
from PySide2 import QtWidgets, QtCore, QtGui


class StatusTipFilter(QtCore.QObject):
    def eventFilter(self, watched: QtCore.QObject, event: QtCore.QEvent) -> bool:
        if isinstance(event, QtGui.QStatusTipEvent):
            return True
        return super().eventFilter(watched, event)


app = QtWidgets.QApplication()
window = QtWidgets.QMainWindow()
window.menuBar().addMenu("File")
window.statusBar().showMessage("Ready")
window.menuBar().installEventFilter(StatusTipFilter(window))
window.show()
app.exec_()

【讨论】:

【参考方案5】:

回答关于从状态栏中删除边框的部分:self.statusbar().setStyleSheet("QStatusBar::item border: 0px solid black ;") 可以解决问题。 setStyleSheet 仅在 statusbar 对象上而不是整个应用程序上很重要。

【讨论】:

以上是关于QStatusBar 消息在菜单悬停时消失的主要内容,如果未能解决你的问题,请参考以下文章

我的博客下拉子菜单在悬停时消失

下拉菜单在悬停时消失(Firefox)

ASP 动态菜单 子菜单 鼠标悬停在子菜单上时消失。

Css 下拉菜单 - 悬停消失

如何将消息从 QWidget 发送到 QStatusBar?

CSS3菜单展开,悬停消失