QWidget 直接派生类的样式表不起作用的解决办法

来源:互联网 发布:两游记配音软件 编辑:程序博客网 时间:2024/06/12 21:57

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


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

工程目录结构如下:

mywidget.h 示例代码如下:

#ifndef MYWIDGET_H#define MYWIDGET_H#include <QWidget>class MyWidget : public QWidget{    Q_OBJECTpublic:    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);}



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



本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky

参考资料:http://blog.csdn.net/dbzhang800

2 0
原创粉丝点击