• Qt 设置背景图片3种方法(三种方法:QPalette调色板,paintEvent,QSS)


    方法1. setStylSheet{"QDialog{background-image:url()"}}  //使用styleSheet 这种方法的好处是继承它的dialog都会自动设置背景,例如更换皮肤就是一个不错的选择

    方法2. QPalette pal;

                pal.setBrush(QPalette::Background,QBrush(QPixmap("")));
                this->setPalette(pal);


    方法3.在paintEvent(QPaintEvent *)事件中                    //这种用于各种自定义控件
         QPainter painter(this);
         painter.drawPixmap(rect(), QPixmap&);

    http://blog.csdn.net/what951006/article/details/51538812

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

    添加在构造函数里面:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /* 设置背景图片 */  
    2. QPixmap pixmap(":/new/prefix1/images/1.png");  
    3. QPalette palette;  
    4. palette.setBrush(backgroundRole(), QBrush(pixmap));  
    5. setPalette(palette);  

    http://blog.csdn.net/emdfans/article/details/27826613

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

    前言:窗口背景无非两种,及背景颜色、背景图片。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(" color: rgb(102, 102, 0);">);
    iLabel = new QLabel(this);
    iLabel->setStyleSheet(" color: rgb(102, 102, 0);">);
    }

     
    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属性:
    设置窗口背景 - dingmz_frc - dingmz_frc的博客
    或代码中:

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

    这样当窗口大小改变时图像也会随着缩放。
    http://blog.163.com/dingmz_frcmyblog/blog/static/21730402320141115552592/
  • 相关阅读:
    重读数据结构——严蔚敏C语言版
    Tcp/Ip网络通讯初探
    XMLHttpRequest post 传递多个参数及服务器端读取
    HDOJ 1106 排序 (字符串处理)
    用Java创建数组工具类ArrayTool
    自己动手编写一个VS插件(三)——创建工具栏之一
    「译」JavaScript 的怪癖 1:隐式类型转换
    javascript 中强制执行 toString()
    VS 2008的64位编译环境的安装和使用
    计算机神书『编码:隐匿在计算机软硬件背后的语言』
  • 原文地址:https://www.cnblogs.com/findumars/p/5578864.html
Copyright © 2020-2023  润新知