QMainwindow PyQt5中的背景图片

Background picture in QMainwindow PyQt5

我正在尝试为我的主window添加背景图片,但我无法使其正常工作。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QLabel
from PyQt5.QtGui import QIcon
from PyQt5 import QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSvg import *
from PyQt5.QtWidgets import *
from abc import abstractmethod


class App(QMainWindow):

    def __init__(self, parent=None):
        super(App, self).__init__(parent=parent)
        self.title = 'Title'
        self.left = 500
        self.top = 500
        self.width = 440
        self.height = 280
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        # ...

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    #view = TableScene(ex)
    ex.show()
    sys.exit(app.exec_())

我尝试了不同种类的方法,但 none 中的方法都能正常工作。 我从另一个主题中找到了以下代码作为解决方案,但它只给我一个黑色背景,其余的小部件变得迟钝。

     oImage = QImage("table.png")
     sImage = oImage.scaled(QSize(440, 280))
     palette = QPalette()
     palette.setBrush(QPalette.Window, QBrush(sImage))
     self.setPalette(palette)

我不知道是不是整个 window 变得迟钝或者真正发生了什么,但下面的图片是使用上面的代码的 window 的一部分的屏幕截图,你可以看到它全黑了,滑块显示了它之前的所有位置,反正有点迟钝。

我也尝试过 setStyleSheet,但我不知道是我的语法错误还是错误的实现方式。有谁知道正确的方法吗?

编辑

这是我目前的 window:

这是我要作为当前 window 背景的图片,图片名为 "table.png" :

这是我正在尝试做的事情的可视化,这是用油漆制作的,因为我不知道如何正确地做:

如果我使用其他主题的代码,这就是我得到的结果:

出现黑色背景的一个可能原因是QImage为空。并且 QImage 为空,因为图像无效或图像路径不正确。在这种情况下,我认为这是第二种情况,因为 OP 使用容易出错的相对路径。解决方案是使用脚本信息构建绝对路径,例如它的位置:

import os
import sys

from PyQt5 import QtCore, QtGui, QtWidgets

<b>CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))</b>


class App(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(App, self).__init__(parent=parent)
        self.initUI()

    def initUI(self):
        self.setWindowTitle("Title")
        self.setGeometry(500, 500, 440, 280)
        oImage = QtGui.QImage(<b>os.path.join(CURRENT_DIR, "table.png")</b>)
        sImage = oImage.scaled(QtCore.QSize(440, 280))
        palette = QtGui.QPalette()
        palette.setBrush(QtGui.QPalette.Window, QtGui.QBrush(sImage))
        self.setPalette(palette)

        pushbutton = QtWidgets.QPushButton("test", self)
        pushbutton.move(100, 100)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = App()
    ex.show()
    sys.exit(app.exec_())


注意:OP提供的图片后缀为.jpg,代码显示的是.png,可能"imgur"改了后缀。

注意:如果手动调整 window 的大小,将观察到以下行为:

因此,根据开发人员的标准,有 2 种可能的解决方案:

  • 设置固定尺寸:self.setFixedSize(440, 280)
  • 使图像适应window的大小:

    import os
    import sys
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
    
    
    class App(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(App, self).__init__(parent=parent)
            self.initUI()
    
        def initUI(self):
            self.setWindowTitle("Title")
            self.setGeometry(500, 500, 440, 280)
            pushbutton = QtWidgets.QPushButton("test", self)
            pushbutton.move(100, 100)
    
            self.oImage = QtGui.QImage(os.path.join(CURRENT_DIR, "table.png"))
            # or QPixmap
            # self.oPixmap = QtGui.QPixmap(os.path.join(CURRENT_DIR, "table.png"))
    
        def paintEvent(self, event):
            painter = QtGui.QPainter(self)
            painter.drawImage(self.rect(), self.oImage)
            # or QPixmap
            # painter.drawPixmap(self.rect(), self.oPixmap)
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        ex = App()
        ex.show()
        sys.exit(app.exec_())
    

    import os
    import sys
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
    
    
    class App(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(App, self).__init__(parent=parent)
            self.initUI()
    
        def initUI(self):
            self.setWindowTitle("Title")
            self.setGeometry(500, 500, 440, 280)
            pushbutton = QtWidgets.QPushButton("test", self)
            pushbutton.move(100, 100)
    
            self.setStyleSheet(
                """
                QMainWindow{
                    border-image: url(%s) 0 0 0 0 stretch stretch
                }
                """
                % os.path.join(CURRENT_DIR, "table.png")
            )
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        ex = App()
        ex.show()
        sys.exit(app.exec_())