python - QT 样式表不产生任何结果

标签 python pyqt

我是 QT 新手,这可能是非常基本的,但我无法让样式表在我的消息框上工作。

我现在的代码是从以下位置调用的:

self.actionLoad_Portfolio_Settings.triggered.connect(self.openPortfolioSettings) 

并且是:

def openPortfolioSettings(self):
     # some code
     QMessageBox.about(self, "Portfolio settings","Portfolio settings loaded successfullly")
     QMessageBox.setStyleSheet(self,".QMessageBox.about {border: 20px solid black;border-radius: 10px;background-color: rgb(1, 1, 1);}")

但这不会执行任何操作,并且消息框会像以前一样出现。

最终我想要做的是为所有对话框、窗口和主窗口设置一个样式表,这样我就可以使用类似的东西:

 my_stylesheet=foo
somewindow.setStyleSheet(my)stylesheet)

非常感谢任何帮助。

最佳答案

QMessageBox.about() 是一个静态方法,因此您无法直接获取对象来设置样式表,因此根据您拥有的附加代码以及是否要对所有 QMessageBox 应用相同的样式,有多种策略。

如果您只想应用于生成 about 方法的 QMessageBox,那么想法就是过滤,在这种情况下,我将假设它是唯一可见的 QMessageBox,然后是 QTimer.singleShot(0, . ..) 用于使用 findChildren() 方法通过其父级获取小部件:

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        settings_menu = self.menuBar().addMenu("Settings")
        self.actionLoad_Portfolio_Settings = settings_menu.addAction(
            "Load Portafolio"
        )
        self.actionLoad_Portfolio_Settings.triggered.connect(
            self.openPortfolioSettings
        )

    @QtCore.pyqtSlot()
    def openPortfolioSettings(self):
        QtCore.QTimer.singleShot(0, self.after_about_portafolio_settings)
        QtWidgets.QMessageBox.about(
            self,
            "Portfolio settings",
            "Portfolio settings loaded successfullly",
        )

    @QtCore.pyqtSlot()
    def after_about_portafolio_settings(self):
        for messagebox in self.findChildren(QtWidgets.QMessageBox):
            if messagebox.isVisible():
                messagebox.setStyleSheet(
                    """QMessageBox{border: 20px solid black;border-radius: 10px;background-color: rgb(1, 1, 1);}"""
                )


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

如果您想将相同的样式应用于窗口中的所有 QMessageBox 子级,则将该样式放置在窗口的样式表中:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setStyleSheet(
            """
            /* another styles*/
            QMessageBox{border: 20px solid black;border-radius: 10px;background-color: rgb(1, 1, 1);}
            """
        )
        settings_menu = self.menuBar().addMenu("Settings")
        self.actionLoad_Portfolio_Settings = settings_menu.addAction(
            "Load Portafolio"
        )
        self.actionLoad_Portfolio_Settings.triggered.connect(
            self.openPortfolioSettings
        )

    @QtCore.pyqtSlot()
    def openPortfolioSettings(self):
        QtWidgets.QMessageBox.about(
            self,
            "Portfolio settings",
            "Portfolio settings loaded successfullly",
        )

如果您想对完整应用程序中的所有 QMessageBox 应用相同的样式,则在 QApplication 中设置样式表:

app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(
    """
    /* another styles*/
    QMessageBox{border: 20px solid black;border-radius: 10px;background-color: rgb(1, 1, 1);}
    """
)
<小时/>

另一个解决方案是不使用 QMessage.about() 方法,而是创建一个 QMessageBox 对象:

def openPortfolioSettings(self):
    messagebox = QtWidgets.QMessageBox(
        QtWidgets.QMessageBox.NoIcon,
        "Portfolio settings",
        "Portfolio settings loaded successfullly",
        parent=self,
    )
    messagebox.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    messagebox.setStyleSheet(
        """
        QMessageBox{border: 20px solid black;border-radius: 10px;background-color: rgb(1, 1, 1);}
        """
    )
    messagebox.exec_()

关于python - QT 样式表不产生任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55949389/

相关文章:

python - Discord.py 从 DM 获取消息

Python FastAPI "Post Unprocessable Entity"错误

python - 如何从一个方法中调用另一个方法?

python - 使用 python 将 Qt 与 Windows 7 任务栏集成?

python - 如何在 QScintilla 中实现 SublimeText 的逐级折叠功能

python - 突出显示 QTextEdit 文档上的行

python - 为 django-datatables-view 转置来自模型对象的数据

python - 如何在循环中跳过某个值而不删除Python中的值

qt - PySide2 QThread 错误 : QThread: Destroyed while thread is still running

python - 单击 PyQt 表项时更改属性