如何将全局样式表设置为自定义窗口小部件?

时间:2017-07-21 10:56:59

标签: qt

在主窗口中,我可以为不同的标准小部件设置CSS样式:

  

setStyleSheet(" QComboBox {background-color:red;} QLabel {background-color:blue;}")

这些样式将应用于具有这些名称的子窗口小部件。

但是有可能以同样的方式为我定义的小部件设置样式吗?

然后这个小部件应该通过其类名获得它的样式。我似乎找不到按类名获取样式表的相应函数。

这是一个例子。

---定制widget.h ---

#include <QWidget>

class MyCustomWidget : public QWidget {
  Q_OBJECT
public:
  MyCustomWidget(QWidget *parent) : QWidget(parent) { }
};

--- --- main.cpp中

#include <QApplication>
#include <QWidget>
#include <QLayout>
#include <QLabel>
#include "custom-widget.h"

int main(int argc, char **argv) {
  QApplication   app (argc, argv);
  QWidget        mainWindow;
  QVBoxLayout    mainLayout(&mainWindow);
  QLabel         label("I am a label", &mainWindow);
  MyCustomWidget customWidget(&mainWindow);

  mainLayout.addWidget(&label);
  mainLayout.addWidget(&customWidget);
  customWidget.setMinimumSize(100, 300);

  mainWindow.setStyleSheet(
    "QLabel { background-color: #5ea6e3; }"
    "MyCustomWidget { background-color: #f00000; }"
  );

  mainWindow.show();

  return app.exec();
}

--- --- main.pro

CONFIG += qt
QT += core gui widgets
TEMPLATE = app
TARGET = main

HEADERS = main.h custom-widget.h
SOURCES = main.cpp

2 个答案:

答案 0 :(得分:0)

是的,样式可以在你自己的小部件上正常工作。

如果您要设置非标准属性,则需要使用Q_PROPERTY声明它们。例如:

class MyWidget : public QWidget
{
     Q_OBJECT
     Q_PROPERTY(QString extra READ extra WRITE setExtra)
     //...
};

然后你可以设置它的样式:

MyWidget {
 background-color: blue;
 color: yellow;
 qproperty-extra: "Some extra text";
}

对于代码示例中的窗口小部件,永远不会绘制背景。需要更改其构造函数以要求Qt使用样式信息绘制背景:

MyCustomWidget(QWidget *parent) : QWidget(parent) {
    setAttribute(Qt::WA_StyledBackground);
}

答案 1 :(得分:0)

将样式表应用于自定义QWidget派生类时,不要忘记覆盖the documentation中提到的paintEvent:

  

QWidget仅支持背景,背景剪辑和   背景源属性。

     

如果您是QWidget的子类,则需要提供paintEvent   您的自定义QWidget如下所示

     

警告:确保为自定义小部件定义Q_OBJECT宏。

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