QStyleOption是风格的设置类,定义了最基本的绘制控件所需的信息。
绘制不同控件时,控件所使用的设置类继承QStyleOption,且OptionType值不同。
如绘制按钮的风格设置类QStyleOptionButton继承QStyleOption时,Type = SO_Button表明是要绘制按钮,且添加了一些按钮才有的属性。
根据QStyleOptionButton来绘制自定义按钮的一例:
class PushButton : public QWidget
{
Q_OBJECT
public:
explicit PushButton(QWidget *parent = nullptr);
~PushButton();
protected:
void paintEvent(QPaintEvent * event)override;
void mousePressEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
private:
Ui::PushButton *ui;
bool isPress;
QString text;
};
#include "pushbutton.h"
#include "ui_pushbutton.h"
#include <QStyleOptionButton>
#include <QDebug>
#include <QPainter>
#include <QMouseEvent>
PushButton::PushButton(QWidget *parent) :
QWidget(parent),
ui(new Ui::PushButton)
{
ui->setupUi(this);
text = "这是一个按钮";
isPress = false;
update();
}
PushButton::~PushButton()
{
delete ui;
}
void PushButton::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
isPress = true;
update();
}
}
void PushButton::mouseReleaseEvent(QMouseEvent *event)
{
isPress = false;
update();
}
void PushButton::paintEvent(QPaintEvent *event)
{
QStyleOptionButton option;
option.initFrom(this);
option.state |= isPress ? QStyle::State_Sunken : QStyle::State_Raised;
option.text = text;
QPainter painter(this);
style()->drawControl(QStyle::CE_PushButton, &option, &painter, this);
}
option.initFrom(this);//使用this的相关属性如rect、state为QStyleOptionButton 对象初始化
//使用本对象的属性设置QStyleOptionButton的初始值
效果:
按下的效果和普通的按钮一样