我正在尝试将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;
};
但是我有普通的小部件
答案 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();
}