如何创建自己的使用QSS的QT小部件

时间:2019-09-13 07:30:27

标签: qt qt5 qwidget qtstylesheets

我正在尝试将qss用于自己的小部件。并在加载新样式表后更改样式。我不明白如何从当前样式表中提取颜色。以及何时更新。

要尝试使用palette().color(QPalette::ColorRole::)获取颜色。并在changeEvent发生时更新它:

class Widget : public QWidget {
    Q_OBJECT
public:
    Widget(QWidget* parent = nullptr)
        : QWidget(parent), primary(this), background(this) {
            update_brushs();
        }

protected:
    void paintEvent(QPaintEvent* event) {
        background.drawRect(event->rect());
        primary.drawText(event->rect(), "hi");

    }

    void changeEvent(QEvent* event) {
        if (event->type() == QEvent::StyleChange) {
            update_brushs();
        }
        QWidget::changeEvent(event);
    }

private:
    void update_brushs() {
        primary.setBrush(palette().color(QPalette::ColorRole::WindowText));
        background.setBrush(palette().color(QPalette::ColorRole::Background));
    }
    QPainter primary;
    QPainter background;
};

但是我有普通的小部件

1 个答案:

答案 0 :(得分:1)

如果您的问题与使用样式表更改背景颜色或文本颜色一样基本,那么下面的内容应该可以助您一臂之力。

Widget.h

#pragma once
#include <QWidget>
#include <QStyleOption>
#include <QPainter>

class Widget
  : public QWidget
{
  Q_OBJECT

  public:
    Widget( QWidget* parent = nullptr )
      : QWidget( parent ) {}
    ~Widget() override = default;

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

可以使用以下文件测试以上内容:

main.cpp

#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>

#include "Widget.h"

int main( int argc, char* argv[] )
{
  QApplication a( argc, argv );
  a.setStyleSheet( "Widget { background-color: blue; }" );

  QWidget one;
  new QVBoxLayout( &one );
  Widget w;
  w.setMinimumSize(200, 200);
  one.show();
  one.layout()->setMargin(20);
  one.layout()->addWidget( &w );

  QPushButton button("Change");
  one.layout()->addWidget( &button );
  QObject::connect(&button, &QPushButton::clicked, &a, [&a](){
    a.setStyleSheet( "Widget { background-color: green; }" );
  });

  return a.exec();
}