我正在使用类
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
上时,它仍然冻结。
你的代码中有很多问题,影响到不同程度的问题,但最重要的是你实际上覆盖了标签的样式表,完全忽略了可以被父级继承的样式表。
您当前的代码也没有将操作添加到菜单中,我假设您只是忘记了它,但这仍然非常重要。
设置样式表时,几乎总是需要使用属性选择器(即使在不包含更多子项的“最终小部件”中),特别是如果可以继承像
: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 文档,尤其是 syntax、reference 和 examples 页面(但不排除其他页面)。无论如何,经验法则是您应该始终考虑选择器类型,并且仅当您完全确定自己在做什么时才应使用通用属性。
如上所述,还有其他相关问题:
setMenuBar()
always 正确设置它;如果您不使用 QMainWindow,也为所有 QLayout 类提供类似的功能;
menuBar()
),因此,除非您确实需要使用自定义子类,否则应该使用它;setDefaultWidget()
之后执行此操作,否则小部件将不会显示;