qt-渲染原理

决定了各种控件在不同OS平台(win10 , apple , vista , xp)等基本的样式;它的继承类实现了相应的接口使得在不同操作平台上观感 , 细节大不相同;也就是说 , 的派生类能够管理到控件的整个绘制过程
Qt 包含一组子类 , 它们模拟 Qt 支持的不同平台的样式(、 等) 。默认情况下 , 这些样式内置在 Qt GUI 模块中 。样式也可以作为插件使用 。
Qt 的内置小部件使用来执行几乎所有的绘图 , 确保它们看起来与等效的原生小部件完全一样 。下图显示了九种不同样式的。
设置样式
可以使用 ::() 函数设置整个应用程序的样式 。它也可以由应用程序的用户使用 -style 命令行选项指定:
./myapplication -style windows
如果没有指定样式 , Qt 会为用户的平台或桌面环境选择最合适的样式 。
也可以使用 ::() 函数在单个小部件上设置样式 。
开发风格感知的自定义小部件
如果您正在开发自定义小部件并希望它们在所有平台上都看起来不错 , 您可以使用函数来执行小部件绘制的部分内容 , 例如 ()、()、()、() 和 ( ) 。
大多数绘图函数采用四个参数:
例如 , 如果你想在你的小部件上绘制一个焦点矩形 , 你可以这样写:
void MyWidget::paintEvent(QPaintEvent * /* event */){QPainter painter(this);QStyleOptionFocusRect option;option.initFrom(this);option.backgroundColor = palette().color(QPalette::Background);style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);}
从获取渲染图形元素所需的所有信息 。小部件作为最后一个参数传递 , 以防样式需要它来执行特殊效果(例如 macOS 上的动画默认按钮) , 但这不是强制性的 。事实上 , 通过正确设置  , 您可以使用在任何绘图设备上绘制 , 而不仅仅是小部件 。
为可以绘制的各种类型的图形元素提供了各种子类 。例如 ,  需要一个 t 参数 。
为了确保绘图操作尽可能快 ,  及其子类具有公共数据成员 。有关如何使用它的详细信息 , 请参阅类文档 。
为方便起见 , Qt 提供了类 , 它结合了 、 和。这使得可以写
QStylePainter painter(this);...painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
创建自定义样式
您可以通过创建自定义样式为您的应用程序创建自定义外观 。创建自定义样式有两种方法 。在静态方法中 , 您可以选择现有的类 , 对其进行子类化 , 然后重新实现虚函数以提供自定义行为 , 或者从头开始创建整个类 。在动态方法中 , 您可以在运行时修改系统样式的行为 。下面介绍静态方法 。中描述了动态方法 。
静态方法的第一步是选择 Qt 提供的样式之一 , 您将从中构建您的自定义样式 。您对类的选择将取决于哪种风格最类似于您想要的风格 。您可以用作基础的最通用类是 (不是 ) 。这是因为 Qt 要求它的样式是。
根据要更改的基本样式的哪些部分 , 您必须重新实现用于绘制界面这些部分的函数 。为了说明这一点 , 我们将修改绘制的旋转框箭头的外观 。箭头是由 () 函数绘制的原始元素 , 因此我们需要重新实现该函数 。我们需要以下类声明:
class CustomStyle : public QProxyStyle{Q_OBJECTpublic:CustomStyle();~CustomStyle() {}void drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const override;};