Фоновая картинка в QMainwindow PyQt5 - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь получить фоновое изображение в своем главном окне, но не могу заставить его работать должным образом.

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

Я пробовал разные виды методов, но ни один из них не работает так, как он должен. Я нашел следующий код в качестве решения из другой топи c, но он просто дает мне черный фон, а остальные виджеты становятся лаги.

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

Я не знаю, если все окно получает Лагги или что на самом деле происходит, но рисунок ниже - это скриншот части окна с использованием приведенного выше кода, и, как вы можете видеть, он становится черным, а ползунок показывает всю предыдущую позицию, в которой он находился, в любом случае, в некотором роде.

Image of the

Я также попробовал setStyleSheet, но я не знаю, является ли мой синтаксис неправильным или это неправильный способ сделать это. Кто-нибудь знает способ сделать это правильно?

РЕДАКТИРОВАТЬ

Это мое текущее окно:

current view

Это изображение Я пытаюсь реализовать в качестве фона для моего текущего окна изображение под названием "table.png":

the picture I want as background

Это визуализация того, что я пытаюсь сделать , и это сделано в краске, так как я не знаю, как это сделать правильно:

desired view

И это то, что я получаю, если я использую код из другой топи c:

incorrect view

1 Ответ

1 голос
/ 06 марта 2020

Одной из возможных причин появления черного фона является то, что QImage имеет значение null. И 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_())

enter image description here


Примечание: Изображение, предоставленное OP, имеет расширение .jpg, но обозначенное кодом является .png, возможно, «imgur» изменило расширение.

Примечание: Если размер окна изменяется вручную будет наблюдаться следующее поведение:

enter image description here

Таким образом, для этого есть 2 возможных решения в зависимости от критериев разработчика:

  • Установить фиксированный размер: 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_())
    
...