前言:窗口背景无非两种,及背景颜色、背景图片。Qt中窗口背景如何设置?总结以下三种方法。

1、QPalette设置背景

2、实现paintEvent,使用QPainter来绘制背景

3、使用QSS来设置背景

---------------------------------------------------------------

关于QSS(样式表)的使用不想多说,一般我不用QSS设置窗口背景,也不建议使用。(注意:这里是对于窗口而言)。如果是子部件当然可以。因为窗口使用QSS设置背景之后,若子部件不使用同样的方式来设置,默认则会继承父窗口的样式。

子部件一般情况下也不需要设置背景图片,即使需要使用QSS也完全可以满足。设置较多的是背景色与图标,QSS中使用background或者background-color的方式可以实现背景色的设置,图标则可以使用setPixmap或者setIcon来设置!

----------------------------------------------------------------------

一、QPalette设置背景

构造函数中可以使用如下方式:

1)设置背景色

 

QPalette palette(this->palette());

palette.setColor(QPalette::Background, Qt::black);

this->setPalette(palette);

或:

 

QPalette palette;

palette.setBrush(this->backgroundRole(), Qt::black);

this->setPalette(palette);

这里setColor和setBrush都可以使用!

这里需要特别注意一点,如果QWidget直接show出来,是有背景色的,但是如果它作为一个父QWidget的子窗口时就没有背景了!此时需要添加如下代码:

 

setAutoFillBackground(true);

2)设置背景图片

 

QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());

QPalette palette(this->palette());

palette.setBrush(QPalette::Background, QBrush(pixmap));

this->setPalette(palette);

上面方式无论设置背景色还是背景图片QPalette::Background与this->backgroundRole()是等价的!

二、paintEvent设置背景

1)设置背景色

 

void IIIMark::paintEvent(QPaintEvent *)

{

QPainter painter(this);

painter.setBrush(Qt::black);

painter.drawRect(this->rect());

}

2)设置背景图片

 

void IIIMark::paintEvent(QPaintEvent *)

{

QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());

QPainter painter(this);

painter.drawPixmap(this->rect(), pixmap);

}

三、QSS样式表)设置背景

1)设置背景颜色

 

MainWin::MainWin()
{
this->setStyleSheet("background-color: yellow");
iLabel = new QLabel(this);
iLabel->setStyleSheet("background-color: rgba(97%,80%,9%,50%)");
}

2)设置背景图片

 

MainWin::MainWin()
{
this->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");
iLabel = new QLabel(this);
iLabel->setStyleSheet("background-image:url(:/bmp/1257253475842.jpg)");
}

---------------------------------------------------------------

注意

(1)以上都是用scaled方式对图片进行了适应窗口大小的设置,因为所给的图片大小不一定满足要求,所以采用此方式!当然图片经过拉伸或者压缩之后会变形(纯色图片除外),所以对图片采用此方式时需要注意。

(2)设置背景范围的时候如果需要充满整个窗口最好使用this->rect(),因为我看到很多人在使用QRect(0, 0, 400, 400)之类的语句,那么如果窗口大小改变了呢?此句是不是要跟着变呢?

(3)如果需要背景图片或者背景色随可以发生改变时,也就是所谓的换肤功能,则采用paintEvent的方式,在需要改变的时候使用update()来进行更新。

(4)this->setAutoFillBackground(true)又让我想起了tr(),被很多人滥用。这句话在什么时候使用呢?不妨采用QPalette设置背景的方式加上与去掉这句话对比一下(在有父窗口的情况下使用)。如果这个QWidget直接show,则有背景色,如果放到一个父窗口中,就没有效果。添加该句即可!

-----------------------------

对比几种方法:前两种可以轻松实现图像的缩放(使用scaled函数),而按照上面使用QSS样式表设置background-image的方式却不能实现,若使用样式表实现静态图像的缩放可以设置border-image属性:

或代码中:

 

setStyleSheet(QString::fromUtf8("border-image: url(:/png/example.png)"));

这样当窗口大小改变时图像也会随着缩放。

原文章:http://blog.163.com/dingmz_frcmyblog/blog/static/21730402320141115552592/

Qt三种方式实现背景色和背景图(都可放缩,qss方式也可以)相关推荐

  1. Qt三种方式实现FTP上传功能

    FTP协议 FTP的中文名称是"文件传输协议",是File Transfer Protocol三个英文单词的缩写.FTP协议是TCP/IP协议组中的协议之一,其传输效率非常高,在网 ...

  2. 三种不同的文本图像背景漂白/纯化/去除算法

    本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/14617355.html  ...

  3. QT三种窗口、调试终端信息打印、新建菜单、设置窗口标题名称、界面初始化、打开文件对话框、保存文件对话框

    三种窗口 QMainWindow:主窗口程序(创建菜单) QWidget:部件窗口 QDialog:对话框窗口 调试终端信息打印 #include <QtDebug>qDebug < ...

  4. 三种手机电池不合格 潜藏爆炸危险(图)

    技术监督局抽查结果表明,为摩托罗拉V3设计的"威泰"等2种锂离子电池待机时间短,而"夏新"等3种锂电池热冲击项目不合格,存在爆炸隐患. 2003年12月23日, ...

  5. 标题栏修改背景色或背景图

    .h中: //标题栏修改 void DrawTitleBar(CDC *pDC); LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM ...

  6. ajax json 403,解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式

    众所周知前端向后台发送 post 请求时,必须验证 csrf,否则会报错 403 Forbidden.使用 Django Form 表单可以直接在表单里面添加 {% csrf_token %} 即可, ...

  7. spring注解之@Import注解的三种使用方式

    1.@Import注解须知 1.@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中 2.加入IOC容器的方式有很多种,@Import注解就相对很牛皮 ...

  8. 前端实现文件下载功能的三种方式

    一些管理系统常常会有导出文件的功能,这里介绍三种文件下载的尝试 1. 通过文件地址下载文件 此方式最为简易,只需要知道文件在服务器上的地址,就可以通过a标签实现下载 <a href=" ...

  9. html 数据双向绑定,javascript实现数据双向绑定的三种方式小结

    前端数据的双向绑定方法 前端的视图层和数据层有时需要实现双向绑定(two-way-binding),例如mvvm框架,数据驱动视图,视图状态机等,研究了几个目前主流的数据双向绑定框架,总结了下.目前实 ...

最新文章

  1. 2018-4-7 包子阳书本39页例题
  2. $(document).ready()和window.onload的区别
  3. 倒计时1天!相约杭州云栖,相遇数据智能
  4. SQLite FTS5使用小技巧
  5. python 编程一日一练-Python每日一练0022
  6. LeetCode-73. Set Matrix Zeroes
  7. 论文的“面子”与“里子”
  8. python邮件图片加密_Python爬虫如何应对Cloudflare邮箱加密
  9. php软件开发--html进阶
  10. 阿里创业员工分享公司的BI选型之路!自研、开源的坑都踩过
  11. mysql 返回几个组_MySQL – 控制由组返回的行
  12. Hugging Face Course-Diving in 抱抱脸 Tokenizers library (Introduction BPE)
  13. 简单计算机病毒黑屏,电脑被木马病毒侵袭,黑屏了怎么处理
  14. 两年工作经验,三面拼多多,最终获得offer!(面经总结)
  15. docker-compose 安装常用服务
  16. dpkg制作deb包详解
  17. Android 热点开启流程
  18. 账号密码忘了不要慌,教你用Python自动解密解码,轻松获取!
  19. elasticsearch 的分词
  20. 【Python + selenium】在浏览器打开新页签

热门文章

  1. magisk卸载内置软件_手机刷入面具magisk授权后,ROOT权限经常丢失解决方法
  2. 计算机辅助项目管理实验论文,计算机辅助项目管理课程设计—毕设论文.doc
  3. 搜索和推荐中的精度和召回(recall)分别是什么意思?
  4. 51单片机学习笔记——SH88F4051A
  5. 6种抗辐射的经典美食
  6. 光子晶体matlab,Matlab光子晶体程序讨论
  7. Python开发培训怎么选
  8. 离散数学 数学三大危机
  9. 如何写出更具有Python风格的代码
  10. copypng emitted errors