从 QWidget 派生一个窗口,使用 stylesheet 设置背景,designer 设置没有问题,或者,通过 setStyleSheet() 设置,代码操作是正确的,编译运行后,却没有背景。
下面为验证例子(通过代码验证,没有使用 designer ):
工程目录结构如下:
mywidget.h 示例代码如下:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
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 <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
编译运行后,窗口的背景图并没有设置成功:
原因是,QWidget 的 paintEvent() 是空的,而样式表要通过 paint 被绘制到窗口中,我们需要重新写 paintEvent() 函数,才能够真正实现继承。
解决办法如下:
mywidget.h 添加如下代码:
//.h文件
// 增加 paintEvent() 的声明
protected:
void paintEvent(QPaintEvent *); //重写paintEvent()
mywidget.cpp 添加如下代码:
// .cpp 文件
// 重写paintEvent()
void MyWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt; // 需要头文件#include <QStyleOption>
opt.init(this);
QPainter p(this); // 需要头文件#include <QPainter>
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
重新编译运行,发现背景图设置成功: