Таблица стилей QT не дает никакого результата - PullRequest
1 голос
/ 02 мая 2019

Я новичок в 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)

Любая помощь высоко ценится.

1 Ответ

2 голосов
/ 02 мая 2019

QMessageBox.about () является статическим методом, поэтому вы не можете получить объект напрямую для установки таблицы стилей, поэтому существует несколько стратегий в зависимости от того, какой дополнительный код у вас есть, и от того, хотите ли вы применить один и тот же стиль ко всем QMessageBox.

Если вы хотите применить только к QMessageBox, который генерирует метод about, тогда идея состоит в том, чтобы фильтровать, в этом случае я буду предполагать, что это единственный видимый 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_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...