QtWidget 给Widget加上背景图实例

QtWidget 给Widget加上背景图实例

2011-06-20 17:17 佚名 互联网 我要评论(0) 字号: T | T
一键收藏,随时查看,分享好友!

本文介绍的是QtWidget给Widget加上背景图实例,内容较少,并以简单的代码实现效果,主要运用了QWidget类,它是所有用户界面对象的基类。

AD: 51CTO云计算架构师峰会 抢票进行中!


    QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己的表现。每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。

    QDialog是最普通的顶级窗口。不被嵌入到一个父窗口部件的窗口部件被叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管如果使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和和不同的QDialog的子类是最普通的顶级窗口。

    一个没有父窗口部件的窗口部件一直是顶级窗口部件。

    关键使用widget的palette的brush.

       
    1. int main(int argc, char *argv[]) {  
    2.     QApplication a(argc, argv);  
    3.     QWidget *widget = new QWidget();  
    4.     widget->setAutoFillBackground(true); // 这句要加上, 否则可能显示不出背景图.  
    5.     QPalette palette = widget->palette();  
    6.     palette.setBrush(QPalette::Window,  
    7.                      QBrush(QPixmap("1.png").scaled( // 缩放背景图.  
    8.                              widget->size(),  
    9.                             Qt::IgnoreAspectRatio,  
    10.                         Qt::SmoothTransformation))); // 使用平滑的缩放方式  
    11.     widget->setPalette(palette); // 至此, 已给widget加上了背景图.  
    12.     QHBoxLayout *layout = new QHBoxLayout();  
    13.     layout->addWidget(widget);  
    14.     QWidget *mw = new QWidget();  
    15.     mw->setLayout(layout);  
    16.     mw->resize(500, 500);  
    17.     //mw->setWindowFlags(Qt::FramelessWindowHint);  
    18.     mw->show();  
    19.     return a.exec();  

    QtWidget 给widget加上背景图实例

    小结:QtWidget widget加上背景图实例的内容介绍完了,对QWidget类作了简单的介绍,并以简单的代码实现效果图,希望本文能够帮你学习QWidget类。


    本文出自:http://mobile.51cto.com/symbian-270173.htm

    <think> 我们参考多个资料,总结在Qt Widget中设置背景图片的几种方法: 1. 使用样式表(CSS)方法(引用[2]和引用[5]) - 可以直接在Qt Designer中设置样式表,也可以通过代码设置。 - 示例代码: ```cpp // 设置指定名称的QWidget背景图片 ui->widget->setStyleSheet("QWidget#WidgetName { border-image: url(:/images/background.jpg); }"); ``` - 注意:使用border-image会拉伸图片填充整个控件。如果要避免影响子控件,需要给子控件单独设置背景(如透明或单独设置)。 2. 重写paintEvent方法(引用[3]) - 这是比较高效的方法,通过重绘事件来绘制背景图片。 - 步骤: a. 在头文件中声明paintEvent事件: ```cpp protected: void paintEvent(QPaintEvent *event) override; ``` b. 在cpp文件中实现: ```cpp void YourWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawPixmap(rect(), QPixmap(":/images/background.jpg")); } ``` 3. 使用调色板(QPalette)(引用[5]和引用[3]中的其他方法) - 示例代码: ```cpp QPalette palette; palette.setBrush(QPalette::Background, QBrush(QPixmap(":/images/background.jpg"))); this->setPalette(palette); ``` - 注意:这种方法可能需要先设置`setAutoFillBackground(true)`(引用[3])。 4. 设置透明背景(引用[4]) - 如果希望背景透明,可以使用以下方法: ```cpp // 方法1:使用调色板设置透明色 QPalette pal = palette(); pal.setColor(QPalette::Background, Qt::transparent); // 或者使用带透明度的颜色 setPalette(pal); ``` 或者 ```cpp // 方法2:设置窗口属性 setAttribute(Qt::WA_TranslucentBackground, true); ``` 注意:如果使用调色板或样式表设置背景图片,需要确保图片路径正确,并且资源文件已经添加到项目中。 总结: - 使用重绘事件(paintEvent)是最灵活高效的方法,尤其当需要自定义绘制时。 - 样式表方法简单易用,适合在Qt Designer中快速设置,但要注意不影响子控件。 - 调色板方法也是一种常用方法,但可能在某些情况下不如重绘事件灵活。 根据具体需求选择合适的方法。 §§相关问题§§ 1. 如何确保Qt Widget背景图片不影响到子控件的背景? 2. 使用样式表设置背景图片时,如何让图片自适应控件大小? 3. 在Qt中,如何实现窗口的半透明效果? </think> ### Qt Widget设置背景图片的方法 在Qt中为Widget设置背景图片,主要有以下几种方法(参考站内资料): #### 1. **使用样式表(推荐)** [^2][^5] ```cpp // 方法1:直接设置控件样式 ui->widget->setStyleSheet("QWidget#yourWidgetName { border-image: url(:/images/bg.png); }"); ``` ```cpp // 方法2:设置图片平铺(自适应大小) QPalette palette; palette.setBrush(QPalette::Background, QBrush( QPixmap(":/bg.png").scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation) )); this->setPalette(palette); ``` **特点**: - 简单直接,不影响子控件背景 - `#yourWidgetName` 需在Qt Designer中设置对象名 - 支持资源文件路径(`:/`)和本地路径 #### 2. **重写paintEvent(高性能)** [^3] ```cpp // 头文件声明 protected: void paintEvent(QPaintEvent *event) override; // CPP实现 void YourWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawPixmap(rect(), QPixmap(":/images/bg.jpg")); } ``` **特点**: - 性能最优,适合频繁刷新 - 需包含头文件`<QPainter>`和`<QPixmap>` - 自动适应窗口大小变化 #### 3. **使用QPalette调色板** [^3][^5] ```cpp this->setAutoFillBackground(true); // 必需 QPalette pale = this->palette(); pale.setBrush(QPalette::Background, QBrush(QPixmap(":/bg.jpg"))); this->setPalette(pale); ``` **注意**: - 必须调用`setAutoFillBackground(true)` - 可能被样式表覆盖(优先级较低) - 部分系统需要额外处理透明度 #### 4. **透明背景处理** [^4] ```cpp // 方法1:设置透明色 QPalette pal = palette(); pal.setColor(QPalette::Background, Qt::transparent); setPalette(pal); // 方法2:启用透明属性 setAttribute(Qt::WA_TranslucentBackground, true); ``` **应用场景**: - 实现不规则窗体 - 控件半透明叠加效果 - PNG图片透明通道支持 #### ⚠️ 注意事项 1. 图片路径使用资源系统(`:/prefix/image.ext`)避免路径问题 2. 优先使用`border-image`(样式表)或`paintEvent`保证自适应 3. 子控件背景需单独设置,否则可能继承父控件背景 4. PNG图片支持透明度,JPG需额外处理透明效果 --- ###
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值