首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一种方法可以更改所有QMessageBox的“确定”按钮的样式表?

是否有一种方法可以更改所有QMessageBox的“确定”按钮的样式表?
EN

Stack Overflow用户
提问于 2021-03-12 17:47:06
回答 2查看 854关注 0票数 2

我想让我的图形用户界面的所有QMessageBox的OK按钮(这是相当复杂的,所以有很多)设置一个与其他按钮不同的颜色(取消,No等)。

我不想每次创建新的QMessageBox时都设置它的颜色,但是我想通过我的应用程序的样式表一次性设置它。

我尝试过不同的选择,但没有一种可行:

代码语言:javascript
运行
复制
 - QMessageBox#okButton {background-color:blue}
 - QMessageBox::okButton {...}
 - QMessageBox:okButton {...}
 - QMessageBox#ok-button {...}
 - QMessageBox QPushButton#okButton {...}

其他人..。

有什么办法吗?还是我必须放弃?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-12 18:58:38

不幸的是,没有直接的解决方案,因为QDialogButtonBox (这是QMessageBox为其按钮使用的)没有为按钮角色提供选择器。

对于静态创建的messagebox,唯一的方法是使用[text="button text"]选择器,但这只是猜测,可能会根据本地化和样式而改变(这可以设置助记符,而且您甚至无法确定这是什么)。此外,这需要为QApplication设置样式表。

针对这些情况,一个可能的应用程序范围的样式表如下所示:

代码语言:javascript
运行
复制
app.setStyleSheet('''
    QDialogButtonBox > QPushButton[text="&OK"] {
        background-color: orange;
    }
    QDialogButtonBox > QPushButton[text="&Cancel"] {
        background-color: green;
    }
''')

请注意,我使用了Parent > Class选择器,以确保只有QDialogButtonBox的按钮使用这些规则的样式,否则任何"Ok“按钮都将是橙色的,等等。

尽管如此,在我的计算机上的情况下,它只适用于Ok按钮,因为我的本地化(意大利语)使用"&Annulla“作为另一个。

另一方面,如果要创建QMessageBox实例,则使用基于对象名称的选择器具有更大的自由度和灵活性。

唯一的问题是,由于对象名称是在创建之后设置的,因此没有应用样式表,因此实例化后按钮必须是“未抛光的”。

一个简单的子类可以提供一个标准接口,而不会使事情变得太复杂:

代码语言:javascript
运行
复制
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_()
票数 2
EN

Stack Overflow用户

发布于 2021-03-12 18:49:51

一个可能的解决方案是将objectName()设置为每个按钮的选择器,为此您可以使用QApplicationnotify()方法。

代码语言:javascript
运行
复制
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()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66604761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档