打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
实战PyQt5: 107

在一些特定情况下,我们需要设置窗口的背景,来实现某种特别的显示效果,比如如果是一个视频窗口,常常将背景设置为黑色,如果是一个要显示带透明度的图像的窗口,常常将窗口的背景设置为国际象棋棋盘的样式等等。

设置窗口的背景,就是设置窗口的背景色或者修改窗口的背景图片,在Qt中,设置窗口背景有三种方法:

  • 使用QPalette设置窗口背景;
  • 使用QSS设置窗口背景;
  • 重新实现PaintEvent,使用QPainter绘制背景。

使用QPalette(调色板)设置窗口背景

使用QPalette设置背景颜色的核心代码如下:

palette = self.palette()
palette.setColor(QPalette.Background, color)
self.setPalette(palette)
self.setAutoFillBackground(True)

使用QBrush设置背景图片时,图像会使用平铺模式来填充背景。因此需要注意背景图片的尺寸大小,当背景图片的宽度和高度大于窗口的宽度或者高度时,背景图像会剪裁掉大于窗口尺寸的部分,当图像尺寸小于窗口尺寸时,图像重复填充窗口。使用QPalette设置背景图片的核心代码如下:

palette = self.palette()
palette.setColor(QPalette.Background, QBrush(QPixmap(image_filename)))
self.setPalette(palette)
self.setAutoFillBackground(True)

使用QSS设置窗口背景

使用QWidget.setStyleSheet()函数可以使用QSS方式为窗口设置背景,设置背景的颜色的方式如下( 假设背景色设置为绿色):

self.setStyleSheet('background-color: green;')

设置背景图像,如果使用拉伸填充方式:

self.setStyleSheet('border-image:url(image_filename)')

如果使用平铺模式:

self.setStyleSheet('background -image:url(image_filename)')

在paintEvent函数中绘制窗口背景

重载部件的paintEvent()函数,在其中使用QPainter来绘制窗口背景,记住,既然是背景,就得首先绘制,不然会覆盖掉绘制背景之前的那些绘制元素。

创建绘图工具:

painter = QPainter(self)

绘制背景颜色的代码(假设背景颜色为蓝色):

painter.fillRect(self.rect(), Qt.blue)

拉伸效果绘制背景

painter.drawPixmap(self.rect(), QPixmap(self.imageFilename)))

平铺效果绘制背景

painter.fillRect(self.rect(), QBrush(QPixmap(image_filename)))

测试代码

测试代码使用了六个QFrame部件对象,演示了使用上述三种方法设置窗口背景,每一种方式演示了颜色和平铺图像方式。图像拉伸方式设置背景的代码也在其中(相关代码被注释,有兴趣的您可以打开注释看运行效果)。 完整代码如下:

import sys,os
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette, QPainter, QBrush, QPixmap, QPen
from PyQt5.QtWidgets import (QApplication, QWidget, QFrame, QGridLayout)
 
class MyWindow(QFrame):
    def __init__(self, type, parent = None):
        super(MyWindow, self).__init__(parent)
        self.setObjectName('MyWindow')
        
        self.type = type      
        self.imageFilename = os.path.dirname(__file__) + "/background.png"   
        
        #palette Background
        if type == 'Palette-Color':  
            palette = self.palette()
            palette.setColor(QPalette.Background, Qt.red)
            self.setPalette(palette)
            self.setAutoFillBackground(True)
            self.info = 'Palette Background Color'
        elif type == 'Palette-Image':
            palette = self.palette()
            palette.setBrush(QPalette.Background, QBrush(QPixmap(self.imageFilename)))
            self.setPalette(palette)
            self.setAutoFillBackground(True)    
            self.info = 'Palette Background Image'
        elif type == 'Sheet-Color':
            self.setStyleSheet('#MyWindow{background-color: green;}')
            self.info = 'Style Sheet Color'
        elif type == 'Sheet-Image':
            #必须将\\ 替换成 / 才能正确显示
            urlName = self.imageFilename.replace('\\', '/')
            #平铺:background:url(),background-image:url();
            #拉伸填充:border-image:url();
            sheet = 'background-image:url(%s);'%(urlName)
            self.setStyleSheet(sheet)
            self.info = 'Style Sheet Image'
        elif type == 'Paint-Color':
            self.info='Paint Background Color'
        elif type == 'Paint-Image':
            self.info='Paint Background Image'
        else:
            print('不支持')
            
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.TextAntialiasing)
        
        #如果是Paint模式则绘制背景
        if self.type == 'Paint-Color':
            painter.fillRect(self.rect(), Qt.blue)
        elif self.type == 'Paint-Image':
            #平铺效果
            painter.fillRect(self.rect(), QBrush(QPixmap(self.imageFilename)))
            #拉伸效果
            #painter.drawPixmap(self.rect(), QPixmap(self.imageFilename))
        
        #居中绘制文本信息
        painter.drawText(self.rect(), Qt.AlignCenter, self.info)
            
 
class WindowBackgroundDemo(QWidget):
    def __init__(self, parent = None):
        super(WindowBackgroundDemo, self).__init__(parent)
        
        # 设置窗口标题
        self.setWindowTitle('实战PyQt5: 设置窗口背景')
        
        #设置窗口尺寸
        self.resize(640, 480)
        
        self.initUi()
        
    def initUi(self):
        layout = QGridLayout()
        
        wid1 = MyWindow('Palette-Color')
        wid2 = MyWindow('Palette-Image')
        wid3 = MyWindow('Sheet-Image')
        wid4 = MyWindow('Sheet-Color')
        wid5 = MyWindow('Paint-Color')
        wid6 = MyWindow('Paint-Image')
        layout.addWidget(wid1, 0, 0)
        layout.addWidget(wid2, 1, 0)
        layout.addWidget(wid3, 0, 1)
        layout.addWidget(wid4, 1, 1)
        layout.addWidget(wid5, 0, 2)
        layout.addWidget(wid6, 1, 2)
        
        self.setLayout(layout)
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = WindowBackgroundDemo()
    window.show()
    sys.exit(app.exec())

运行效果如下图:

窗口背景设置测试

本文知识点

  • 使用三种不同方式设置窗口的背景;
  • 以图片为窗口背景时,可以有拉伸和平铺等实现方式。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
pyqt5 动画学习(一) 改变控件大小
【教程】如何让你的360doc有声有色
QSS编辑器—实时预览 语法提示 颜色拾取
qt设置窗口的背景图片
Qt背景设置成黑色前景设为白色方法
QT中 窗口部件的 背景图片 的设置
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服