【问题标题】:Background picture in QMainwindow PyQt5QMainwindow PyQt5中的背景图片
【发布时间】:2020-06-18 07:15:58
【问题描述】:

我正在尝试将背景图像添加到我的主窗口,但我无法使其正常工作。

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

我尝试了不同类型的方法,但没有一种方法可以正常工作。 我发现以下代码作为另一个主题的解决方案,但它只是给我一个黑色背景,其余小部件变得迟钝。

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

我不知道是整个窗口变得迟钝还是真的发生了什么,但下图是使用上面的代码截取的窗口的一部分,你可以看到它全黑,滑块显示所有它之前的位置,无论如何有点滞后。

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

编辑

这是我当前的窗口:

这是我试图作为当前窗口背景的图片,名为“table.png”的图片:

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

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

【问题讨论】:

  • “其余的小部件变得迟钝”是什么意思?另外,您能否向我们展示您是如何尝试设置样式表(包括其内容)的,即使它们不起作用?
  • 添加了一张图片和我对 laggy 的意思的简短描述。我已经尝试了几个不同版本的 QMainWindow.setStyleSheet(self, 'table.png') 但它与那行代码并没有任何区别。背景仍然是没有它的白色。
  • @bjorstig 1) 您可以提供 table.png,2) 显示您想要获取的图片,3) 提供 minimal reproducible example
  • @eyllanesc 我已经编辑了问题并添加了一些图片

标签: python pyqt pyqt5 qmainwindow


【解决方案1】:

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

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)
        oImage = QtGui.QImage(os.path.join(CURRENT_DIR, "table.png"))
        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”更改了后缀。

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

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

  • 设置固定大小:self.setFixedSize(440, 280)
  • 使图像适应窗口大小:

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

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多