我想让我的图形用户界面的所有QMessageBox
的OK按钮(这是相当复杂的,所以有很多)设置一个与其他按钮不同的颜色(取消,No等)。
我不想每次创建新的QMessageBox
时都设置它的颜色,但是我想通过我的应用程序的样式表一次性设置它。
我尝试过不同的选择,但没有一种可行:
- QMessageBox#okButton {background-color:blue}
- QMessageBox::okButton {...}
- QMessageBox:okButton {...}
- QMessageBox#ok-button {...}
- QMessageBox QPushButton#okButton {...}
其他人..。
有什么办法吗?还是我必须放弃?
发布于 2021-03-12 18:58:38
不幸的是,没有直接的解决方案,因为QDialogButtonBox (这是QMessageBox为其按钮使用的)没有为按钮角色提供选择器。
对于静态创建的messagebox,唯一的方法是使用[text="button text"]
选择器,但这只是猜测,可能会根据本地化和样式而改变(这可以设置助记符,而且您甚至无法确定这是什么)。此外,这需要为QApplication设置样式表。
针对这些情况,一个可能的应用程序范围的样式表如下所示:
app.setStyleSheet('''
QDialogButtonBox > QPushButton[text="&OK"] {
background-color: orange;
}
QDialogButtonBox > QPushButton[text="&Cancel"] {
background-color: green;
}
''')
请注意,我使用了Parent > Class
选择器,以确保只有QDialogButtonBox的按钮使用这些规则的样式,否则任何"Ok“按钮都将是橙色的,等等。
尽管如此,在我的计算机上的情况下,它只适用于Ok按钮,因为我的本地化(意大利语)使用"&Annulla“作为另一个。
另一方面,如果要创建QMessageBox实例,则使用基于对象名称的选择器具有更大的自由度和灵活性。
唯一的问题是,由于对象名称是在创建之后设置的,因此没有应用样式表,因此实例化后按钮必须是“未抛光的”。
一个简单的子类可以提供一个标准接口,而不会使事情变得太复杂:
class ColoredMessageBox(QtWidgets.QMessageBox):
StandardNames = {
QtWidgets.QMessageBox.Ok: 'Ok',
QtWidgets.QMessageBox.Cancel: 'Cancel',
QtWidgets.QMessageBox.Save: 'Save',
# ...
}
def exec_(self):
for button in self.buttons():
objName = self.StandardNames.get(self.standardButton(button))
if objName:
button.setObjectName(objName)
self.style().unpolish(button)
return super().exec_()
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet('''
QMessageBox > QDialogButtonBox > QPushButton#Ok {
background-color: orange;
}
QMessageBox > QDialogButtonBox > QPushButton#Cancel {
background-color: blue;
}
''')
w = ColoredMessageBox(QtWidgets.QMessageBox.Information, 'Hello', 'How are you?',
QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
w.exec_()
发布于 2021-03-12 18:49:51
一个可能的解决方案是将objectName()
设置为每个按钮的选择器,为此您可以使用QApplication
的notify()
方法。
from PySide2.QtCore import QEvent
from PySide2.QtWidgets import *
class Application(QApplication):
def notify(self, receiver, event):
if isinstance(receiver, QMessageBox) and event.type() == QEvent.Show:
for button in receiver.buttons():
sb = receiver.standardButton(button)
if not button.objectName():
button.setObjectName(sb.name.decode())
button.style().unpolish(button)
button.style().polish(button)
return super().notify(receiver, event)
def main():
app = Application()
app.setStyle("fusion")
app.setStyleSheet(
"""
QPushButton#Ok { background-color: green }
QPushButton#Cancel { background-color: red }
"""
)
QMessageBox.critical(
None, "Title", "text", buttons=QMessageBox.Ok | QMessageBox.Cancel
)
msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
msgBox.exec_()
if __name__ == "__main__":
main()
https://stackoverflow.com/questions/66604761
复制相似问题