QT样式表不产生任何结果

2024-06-26 13:39:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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);}")

但这并没有起任何作用,消息框会像以前一样出现。你知道吗

最后,我要做的是为所有对话框、widows和主窗口设置一个样式表,这样我就可以使用如下内容:

 my_stylesheet=foo
somewindow.setStyleSheet(my)stylesheet)

非常感谢您的帮助。你知道吗


Tags: 代码self消息settingsmyqt样式表about
1条回答
网友
1楼 · 发布于 2024-06-26 13:39:20

你知道吗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_()

相关问题 更多 >