QStatusBar信息在菜单悬停时消失

7 投票
5 回答
4573 浏览
提问于 2025-04-18 12:55

我有一个非常基础的 QMainWindow 应用程序,它包含一个 menubar(菜单栏)和一个 statusbar(状态栏)。当我把鼠标放在菜单上时,状态消息就消失了。更准确地说,状态消息被清空了。我不知道是什么导致了这种情况,但这让我在处理本来应该很简单的事情时遇到了很大的困难。

这有几个问题: 我可以通过在 QStatusBar 中添加一个 QLabel 小部件来让消息保持显示,但这样就会出现一个尴尬的边框。我不想要这个边框。我知道唯一能去掉边框的方法是用 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_()

5 个回答

0

关于如何去掉状态栏的边框,可以用这段代码:self.statusbar().setStyleSheet("QStatusBar::item{ border: 0px solid black };")。这里要注意的是,setStyleSheet 这个设置只要在 statusbar 对象上进行,而不是在整个应用程序上。

3

一个完整的例子

# 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_()
4

我来更新一下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)
8

我也遇到了同样的问题,我找到了一种新的解决方法,就是创建一个新的 QLabel

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

然后把它作为一个小部件添加到状态栏的左边

self.statusBar.addWidget(self.myMessage)

或者右边

self.statusBar.addPermanentWidget(self.myMessage)
4

简单来说,当你把鼠标放在每个小部件上时,它们会把状态栏的文字设置为它们的 statusTip 属性,即使这个属性是空的,也会有这样的效果。

对于 QMenu 来说,文字是存储在 menuAction 动作的状态提示中的,所以你可以设置一些文字,而不是像这样简单地清空状态栏:

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

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

撰写回答