qt-渲染原理( 四 )

< 4; ++i) {linearGradient.setColorAt(0.25 *i, gradientColors[i]);}painter->fillRect(labelRect, QBrush(linearGradient));painter->setPen(QPen(penColor));painter->drawText(labelRect, comboBoxOption->currentText, QTextOption(Qt::AlignCenter));break;}default:QProxyStyle::drawControl(element, option, painter, widget);}}void CustomeStyle::drawPrimitive(QStyle::PrimitiveElement element,const QStyleOption *option,QPainter *painter,const QWidget *widget) const{switch (element) {default:QProxyStyle::drawPrimitive(element, option, painter, widget);}}QSize CustomeStyle::sizeFromContents(QStyle::ContentsType type,const QStyleOption *option,const QSize &size,const QWidget *widget) const{switch (type) {default:return QProxyStyle::sizeFromContents(type, option, size, widget);}}QRect CustomeStyle::subControlRect(QStyle::ComplexControl cc,const QStyleOptionComplex *opt,QStyle::SubControl sc,const QWidget *widget) const{switch (cc) {//sub controls used by ComboBoxcase SC_ComboBoxFrame:{//An QEditLine is created according to this return value.//In this Qt version, `opt` is an entire widget rectangle.QRect labelRect = opt->rect;return labelRect.adjusted(1, 1, -(labelRect.width() * 0.2)-1, -1);}//this value is not used by QStyle!case SC_ComboBoxListBoxPopup:return QRect(0, 0, 0, 0);case SC_ComboBoxEditField:return QRect(0, 0, 0, 0);case SC_ComboBoxArrow:return QRect(0, 0, 0, 0);default:return QProxyStyle::subControlRect(cc, opt, sc, widget);}}QRect CustomeStyle::subElementRect(QStyle::SubElement element,const QStyleOption *option,const QWidget *widget) const{return QProxyStyle::subElementRect(element, option, widget);}
#include "mainwindow.h"#include "ui_mainwindow.h"#include "CustomeStyle.h"#include MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);auto nativeStyles = QStyleFactory::keys();for (auto it = nativeStyles.begin(); it != nativeStyles.end(); ++it) {ui->styleComboBox->addItem(*it);}ui->styleComboBox->addItem("CustomeStyle");connect(ui->enableEditCheckBox, &QCheckBox::clicked,[this](bool checked) {ui->styleComboBox->setEditable(checked);});connect(ui->applyStyleButton, &QPushButton::released,[this]() {auto styleType = ui->styleComboBox->currentText();auto app = static_cast(QCoreApplication::instance());if (styleType == "CustomeStyle")app->setStyle(new CustomeStyle());elseapp->setStyle(QStyleFactory::create(styleType));});ui->styleComboBox->setCurrentIndex(0);ui->applyStyleButton->released();}MainWindow::~MainWindow(){delete ui;}
优点:
缺点:
Qt 绘制引擎
绘制引擎是我们开发者用的一些常见的接口 。光栅化引擎是绘制引擎一部分的实现 。
一个小例子:假如要画一条线 , 需要哪几步
要把画一条线总共需要几个角色(要把大象装冰箱总共分几步)
第一步 , 需要一个人(画线的方法)
第二步 , 需要一个笔 。
第三步 , 需要一张纸 。
换成Qt来画线的话那就是
第一步 , 需要一个光栅化引擎()
第二步 , 需要一个笔()
第三步 , 需要一个设备()
所以Qt给我们暴露的接口就是这三个
Qt 绘制引擎简介
 ,  , 组成了Qt绘制界面的基础 。
Qt 的绘画系统可以使用相同的 API 在屏幕和打印设备上绘画 , 并且主要基于、和类 。
用于执行绘图操作 , 是二维空间的抽象 , 可以使用进行绘制 , 提供了用来在不同类型的设备上绘制的接口 。类由和内部使用 , 并且对应用程序程序员隐藏 , 除非他们创建自己的设备类型 。
这种方法的主要好处是所有绘画都遵循相同的绘画管道 , 从而可以轻松添加对新功能的支持并为不受支持的功能提供默认实现 。
三个类的官方说明如下