QWidgetAction:悬停在 QMenuBar 中不起作用并且不想悬停

问题描述 投票:0回答:1

我正在使用类

QMainWindow
,因为悬停不想以任何方式工作。

代码如下:-

#First imports
import PyQt5, sys

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QFileDialog, QMdiSubWindow, QMdiArea, QToolBar, QAction, QTextEdit, QVBoxLayout, QWidget, QMenuBar, QWidgetAction, QMenu
from PyQt5.QtGui import QTextOption, QFont, QPixmap, QImage, QIcon

class UI(QMainWindow):
    def __init__(self):
        super(UI, self).__init__()
    
#The code below is inside QMainWindow class and win = the class UI(QMainWindow) then win.show()

        self.setStyleSheet("""

        QMenuBar {
            background-color: white;
            color: black;
            border: 3px solid silver;
            font-weight: bold;
            font-size: 23px;
        }

        QMenuBar::item {
            background-color: white;
            border: 2px solid silver;
        }

        QMenuBar::item::selected {
            background-color: grey;
        }
        
        QLabel:hover { 
            background-color: grey;
        }

/*note that this is a tag: I tried both QLabel and QWidgetAction :hover method and its not working*/
        
        """)

        self.Menu = QMenuBar(self)
        self.Menu.resize(self.width(), 40)
        self.Menu.move(0, 0)
        
        self.File = self.Menu.addMenu('File')
        
        self.FileNew = QWidgetAction(self.File)
        self.New = QLabel("New")

        self.New.setMouseTracking(True)
        self.New.setAlignment(QtCore.Qt.AlignCenter)
        self.New.setStyleSheet("border: 2px solid silver; "
                       "background-color: white; color: black; "
                       "padding: 4 4 4 4px")
        self.FileNew.setDefaultWidget(self.New)

def Start1():
    app = QApplication(sys.argv)
    win = UI()
    win.show()
    app.exec_()

Start1()

我在许多关于

:hover
方法的线程和文档中搜索并尝试了它,但它对我不起作用。当我将鼠标悬停在
QWidgetAction
上时,它仍然冻结。

python pyqt5 qlabel qwidgetaction
1个回答
0
投票

你的代码中有很多问题,影响到不同程度的问题,但最重要的是你实际上覆盖了标签的样式表,完全忽略了可以被父级继承的样式表。

您当前的代码也没有将操作添加到菜单中,我假设您只是忘记了它,但这仍然非常重要。

设置样式表时,几乎总是需要使用属性选择器(即使在不包含更多子项的“最终小部件”中),特别是如果可以继承像

:hover
这样的伪状态。

以下规则应用于窗口:

        QLabel:hover { 
            background-color: grey;
        }

但是,由于您在标签样式表中使用通用属性,它们将覆盖任何先前设置的规则。考虑原始代码:

        self.New.setStyleSheet("border: 2px solid silver; "
                       "background-color: white; color: black; "
                       "padding: 4 4 4 4px")

与此几乎相同:

        self.New.setStyleSheet("""
            * { 
                border: 2px solid silver; 
                background-color: white; color: black; 
                padding: 4 4 4 4px;
            }
        """)

通配符选择器将属性应用于任何状态下的任何小部件,包括

:hover

更合适的解决方案可能是使用正确的选择器,它为任何状态设置默认属性,但也指定否定悬停状态的情况:

        self.New.setStyleSheet("""
            QLabel { 
                border: 2px solid silver; 
                color: black; 
                padding: 4 4 4 4px;
            }
            QLabel:!hover {
                background-color: white;
            }
        """)

实际上,两个样式表(窗口和标签)可能应该合并,并使用更正确的选择器:

        self.setStyleSheet("""
            /* ...QMenuBar as above */

            QMenu > QLabel { 
                border: 2px solid silver; 
                color: black; 
                padding: 4 4 4 4px;
                background-color: white;
            }

            QMenu > QLabel:hover { 
                background-color: grey;
            }

我强烈建议您阅读整个 QSS 文档,尤其是 syntaxreferenceexamples 页面(但不排除其他页面)。无论如何,经验法则是您应该始终考虑选择器类型,并且仅当您完全确定自己在做什么时才应使用通用属性。

如上所述,还有其他相关问题:

  • 菜单栏只是添加为窗口的子窗口,并且从未设置为实际菜单栏;如果您需要自定义菜单栏,则必须使用 setMenuBar()
     
    always
    正确设置它;如果您不使用 QMainWindow,也为所有 QLayout 类提供类似的功能;
  • QMainWindow 已经提供了一个可以自动创建的菜单栏(如果不存在,请参阅
    menuBar()
    ),因此,除非您确实需要使用自定义子类,否则应该使用它;
  • 如上所述,您永远不会将操作添加到菜单中;即使您在真实代码中执行了此操作,请记住,您也必须在调用 setDefaultWidget()
    之后
    执行此操作,否则小部件将不会显示;
  • 大写的名称通常保留给类和常量名称(请参阅官方的Python代码样式指南,但这也是大多数编程语言中的约定),并且您应该避免对变量和属性使用该样式,因为它会生成代码可读性较差;
© www.soinside.com 2019 - 2024. All rights reserved.