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_()