如何更改 QMainWindow 中央小部件的背景图像?

How to change the background image of a QMainWindow central widget?

我正在尝试更改 QMainWindow 中央小部件的背景图像。 QMainWindow 的背景很容易更改,但我无法通过它的中央小部件获得相同的结果。我试过的是代码

self.mdi = QMdiArea()
self.options_window = Options()
self.central_widget = QStackedWidget()
self.mdi.setStyleSheet("{background-image: url(ninja.png);}")
self.setCentralWidget(self.central_widget)
self.central_widget.addWidget(self.mdi)
self.central_widget.addWidget(self.options_window)
self.central_widget.setCurrentWidget(self.mdi)

我也试过这个

self.mdi = QMdiArea()
self.options_window = Options()
self.central_widget = QStackedWidget()
self.central_widget.setStyleSheet("{background-image: url(ninja.png);}")
self.setCentralWidget(self.central_widget)
self.central_widget.addWidget(self.mdi)
self.central_widget.addWidget(self.options_window)
self.central_widget.setCurrentWidget(self.mdi)

谁能帮我解决这个问题?

要更改 QWidget 的背景图像,您应该覆盖 paintEvent 方法,在您的情况下,您在 QStackedWidget 中,我们创建一个继承自此的 class:

class StackedWidget(QStackedWidget):
    def __init__(self, parent=None):
        QStackedWidget.__init__(self, parent=parent)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), QPixmap("ninja.png"))
        QStackedWidget.paintEvent(self, event)

然后你改变:

self.central_widget = QStackedWidget()

至:

self.central_widget = StackedWidget()

示例:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class StackedWidget(QStackedWidget):
    def __init__(self, parent=None):
        QStackedWidget.__init__(self, parent=parent)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), QPixmap("image.png"))
        QStackedWidget.paintEvent(self, event)

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent=parent)
        self.setCentralWidget(StackedWidget())

if __name__ == '__main__':

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

截图:

QStackedWidget 的情况是一个特殊情况,因为它没有显示,它用于显示其他小部件,对于那些小部件,您必须更改背景图像。

根据您的代码,他们附加的第一个小部件是 QMdiArea,这也是一个特殊情况,因为它有一个视口,应该更改。

class MdiArea(QMdiArea):
    def __init__(self, parent=None):
        QMdiArea.__init__(self, parent=parent)

    def paintEvent(self, event):
        QMdiArea.paintEvent(self, event)
        painter = QPainter(self.viewport())
        painter.drawPixmap(self.rect(), QPixmap("image.png"))

在您的代码更改中:

self.mdi = QMdiArea()

至:

self.mdi = MdiArea()

截图: