QWidget和QApplication的setStyleSheet之间的区别

时间:2014-11-01 15:14:14

标签: qt5 qstylesheet

在我的主要内容中,我尝试为我的mainwidget设置样式表(QWidget的子类)。但遗憾的是它并不适用。使用qApp可以正常运行。有什么不同?在我无法找到的文档中。

1 个答案:

答案 0 :(得分:0)

您需要实施paintEvent才能使QSS个样式在QWidget派生类中工作:

void mainwidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

如果您在qApp上设置样式表,我不认为它有效,我做了一个测试而且它没有:

main.cpp中:

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qApp->setStyleSheet("QWidget{ background-color: red; } MyCustomWidget { background-color: blue; } ");
    Widget w;
    w.show();

    return a.exec();
}

mycustomwidget.h:

#ifndef MYCUSTOMWIDGET_H
#define MYCUSTOMWIDGET_H

#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
class MyCustomWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyCustomWidget(QWidget *parent = 0);

signals:

public slots:

protected:
//    void paintEvent(QPaintEvent *e);

};

#endif // MYCUSTOMWIDGET_H

mycustomwidget.cpp:

#include "mycustomwidget.h"

#include <QStyleOption>

MyCustomWidget::MyCustomWidget(QWidget *parent) :
    QWidget(parent)
{
}

//void MyCustomWidget::paintEvent(QPaintEvent *)
//{
//    QStyleOption opt;
//    opt.init(this);
//    QPainter p(this);
//    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
//}

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

widget.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>465</width>
    <height>392</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="1">
    <widget class="QWidget" name="widget_2" native="true">
     <property name="styleSheet">
      <string notr="true"/>
     </property>
    </widget>
   </item>
   <item row="0" column="2">
    <widget class="MyCustomWidget" name="widget" native="true">
     <property name="styleSheet">
      <string notr="true"/>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>MyCustomWidget</class>
   <extends>QWidget</extends>
   <header>mycustomwidget.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

结果:

enter image description here

取消注释注释代码会产生以下结果:

enter image description here

所以我不知道它对你有用......也许问题出在其他地方,所以请告诉我们代码。