如何创建自己的使用 qss 的 qt 小部件

Posted

技术标签:

【中文标题】如何创建自己的使用 qss 的 qt 小部件【英文标题】:How create own qt widget which use qss 【发布时间】:2019-09-13 07:30:27 【问题描述】:

我正在尝试将 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;
;

但我有普通的小部件

【问题讨论】:

您为什么使用paintEvent() 重载而不仅仅是样式表? @TheBadger 因为我想用自己的自定义paintEvent创建小部件并通过样式表自定义它。问题是:如何访问样式表的样式(颜色)以及何时需要更新缓存的颜色 【参考方案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 );
    
;

以上可以用以下文件进行测试:

ma​​in.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();

【讨论】:

以上是关于如何创建自己的使用 qss 的 qt 小部件的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 如何覆盖小部件?

具有单独布局的嵌套 Qt 小部件

是啥让 Qt 小部件及其布局正常运行(就其大小而言)?

QSS类的用法及基本语法介绍

✿3-The Basics-使用Qt Widgets进行GUI设计

✿3-The Basics-使用Qt Widgets进行GUI设计