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_())
我正在尝试为我的主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_())