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

标签 python python-3.x pyqt background-image pyqt5

我正在尝试更改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 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_())

屏幕截图:

enter image description here

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

从您的代码来看,它们附加的第一个小部件是QMdiArea,这也是一种特殊情况,因为它有一个视口(viewport),应该更改。

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

截图:

enter image description here

enter image description here

关于python - 如何更改 QMainWindow 中央小部件的背景图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936911/

相关文章:

ubuntu - 安装了 Python3,但它在 Ubuntu 中输出错误

python - 在Python命令中添加管道符号

python - 使用随机函数(Python turtle 图形)

Python (PyQt5) 版本的 Qt 标注示例

python - PyQt QtWebChannel : calling Python function from JavaScript

python - 无法使用 angularjs 调用 python 文件输出

python - 在Python中,是否可以使用Active Directory密码身份验证连接Azure SQL Server?

python - 在 python 中从 S3 加载 npy 文件

带有 Bloomberg API 的 Python 2.7 导入 blpapi 失败

qt - 用 Qt 图像替换一些文本