我是 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/