本文主要介绍三种Qt设置背景图片的方法:

1、QPalette

2、重写paintEvent

3、设置Qss(Qt style sheet)

1、QPalette

(1)示例

//.cpp


    this->resize(450,700);
    QPalette pa(this->palette());

    QImage img = QImage(":/img/01.jpg");
    img = img.scaled(this->size());


    QBrush *pic = new QBrush(img);

    pa.setBrush(QPalette::Window,*pic);

    //this->setAutoFillBackground(true);
    this->setPalette(pa);

QPalette主要通过void QPalette::setBrush ( ColorRole role, const QBrush & brush );函数来设置背景图片,其中ColorRole设置为QPalette::window(具体信息查看QPalette的讲解)。当设置具有父窗体的窗体背景时,需要加上setAutoFillBackground(true)来显示背景。

(2)结果图

2、重写paintEvent

所有QWidget的子类都继承了QWidget中的虚函数:[virtual protected] void QWidget::paintEvent(QPaintEvent *event)。在新的窗体中通过对改虚函数进行重写,即可完成对窗体的背景进行设置。

(1)示例

//.cpp




#include "pain.h"
#include <QPainter>
#include <QPixmap>
#include "palette.h"


Pain::Pain(QWidget *parent) : QWidget(parent)
{
    this->resize(450,700);
    this->setWindowTitle("PainEvent");
}


void Pain::paintEvent(QPaintEvent *event)
{
    QPainter *painter = new QPainter(this);

    QPixmap pic = QPixmap(":/img/03.jpg");
    //pic = pic.scaled(this->width(),this->height());

    painter->drawPixmap(0,0,this->width(),this->height(),pic);

}

在本例中,重写paintEvent事件时使用QPainter类的 void QPainter::drawPixmap(int x, int y, int w, int h, const QPixmap &pixmap, int sx, int sy, int sw, int sh)方法对窗体的背景进行设置。

(2)结果图

3、设置Qss

Qss使用Qt开发的一种类似于Css的语法机制,能够设置各种样式的窗体。窗体通过使用void setStyleSheet(const QString &sheet)来设置与 字符串sheet相对应的样式。具体的Qss语法机制可查看帮助文档(Qt style sheet)。

(1)示例

//.cpp

#include "setstyle.h"
#include "pain.h"
#include <QFrame>

SetStyle::SetStyle(QFrame *parent) : QFrame(parent)
{
    this->resize(450,700);
    this->setWindowTitle("Qss");
    this->setStyleSheet("QFrame{background-image:url(:/img/02.jpg)}");
}

(2)结果图

4、三种方法简单比较

使用三种方法都可以设置背景图片,但是当窗体大小变化时,背景图片的覆盖方式会随着变化。

(1)QPalette设置的背景图片会重叠覆盖,如:

 

(2)paintEvent设置的图片会进行拉伸覆盖窗体,如:

(3)而设置Qss方式上面两种覆盖方式都可实现。

           当Qss设置为   background-image:url(:/img.jpg)  则完成重叠式覆盖

            当Qss设置为   border-image:url(:/img.jpg)  则完成拉伸式覆盖

 

本文是自己的学习笔记,可能不完全正确,仅供参考!

      参考连接:1、https://wenku.baidu.com/view/f5cdfdeaaeaad1f346933f27

                         2、https://blog.csdn.net/qq_25800311/article/details/80874757

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐