qwidget美化_QWidget 直接派生类的样式表不起作用的解决办法

在直接派生QWidget并尝试用样式表设置背景时,代码可能不起作用。原因是缺省的paintEvent()没有处理背景绘制。解决方法是在派生类中重写paintEvent(),调用QStyleOption和QPainter进行绘制,从而实现背景图的显示。通过这个方法,可以成功设置QWidget的背景图像。
摘要由CSDN通过智能技术生成

从 QWidget 派生一个窗口,使用 stylesheet 设置背景,designer 设置没有问题,或者,通过 setStyleSheet() 设置,代码操作是正确的,编译运行后,却没有背景。

下面为验证例子(通过代码验证,没有使用 designer):

工程目录结构如下:

8e933a73a90b01a6e982adb520abd08f.png

mywidget.h 示例代码如下:

#ifndef MYWIDGET_H

#define MYWIDGET_H

#include

class MyWidget : public QWidget

{

Q_OBJECT

public:

MyWidget(QWidget *parent = 0);

~MyWidget();

};

#endif // MYWIDGET_H

mywidget.cpp 示例代码如下:

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)

: QWidget(parent)

{

// 通过样式表给窗口设置背景图

// "MyWidget" 为类名

// "../test/test.jpg": 为图片路径,相对于可执行程序的相对路径

this->setStyleSheet(".MyWidget{background-image: url(../test/test.jpg);} ");

}

MyWidget::~MyWidget()

{

}

main.cpp 示例代码如下:

#include "mywidget.h"

#include

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MyWidget w;

w.show();

return a.exec();

}

编译运行后,窗口的背景图并没有设置成功:

55205499925257163fe3ec3728cf5009.png

原因是,QWidget 的 paintEvent() 是空的,而样式表要通过 paint 被绘制到窗口中,我们需要重新写 paintEvent() 函数,才能够真正实现继承。

解决办法如下:

mywidget.h 添加如下代码:

//.h文件

// 增加 paintEvent() 的声明

protected:

void paintEvent(QPaintEvent *); //重写paintEvent()

7567610231c42f060190c9e1e1009f17.png

mywidget.cpp 添加如下代码:

// .cpp 文件

// 重写paintEvent()

void MyWidget::paintEvent(QPaintEvent *)

{

QStyleOption opt; // 需要头文件#include

opt.init(this);

QPainter p(this); // 需要头文件#include

style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

}

bf33fc7026e51ff27c15fd98688f11c0.png

重新编译运行,发现背景图设置成功:

e2b765f6c50bcc3215b9ec5301e97342.png

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文:http://blog.csdn.net/tennysonsky/article/details/46653571

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值