qt-渲染原理( 二 )


为了绘制向上和向下箭头 ,  使用和原语元素 。以下是如何重新实现 () 函数以不同方式绘制它们:
void CustomStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const{if (element == PE_IndicatorSpinUp || element == PE_IndicatorSpinDown) {QPolygon points(3);int x = option->rect.x();int y = option->rect.y();int w = option->rect.width() / 2;int h = option->rect.height() / 2;x += (option->rect.width() - w) / 2;y += (option->rect.height() - h) / 2;if (element == PE_IndicatorSpinUp) {points[0] = QPoint(x, y + h);points[1] = QPoint(x + w, y + h);points[2] = QPoint(x + w / 2, y);} else { // PE_SpinBoxDownpoints[0] = QPoint(x, y);points[1] = QPoint(x + w, y);points[2] = QPoint(x + w / 2, y + h);}if (option->state & State_Enabled) {painter->setPen(option->palette.mid().color());painter->setBrush(option->palette.buttonText());} else {painter->setPen(option->palette.buttonText().color());painter->setBrush(option->palette.mid());}painter->drawPolygon(points);} else {QProxyStyle::drawPrimitive(element, option, painter, widget);}}
请注意 , 我们不使用参数 , 只是将它传递给 ::() 函数 。如前所述 , 关于要绘制什么以及应该如何绘制的信息由对象指定 , 因此无需询问小部件 。
如果您需要使用参数来获取附加信息 , 请在使用前小心确保它不为 0 并且类型正确 。例如:
const QSpinBox *spinBox = qobject_cast(widget);if (spinBox) {...}
在实现自定义样式时 , 您不能仅仅因为枚举值称为或就假定小部件是。
示例的文档更详细地介绍了这个主题 。
警告:自定义子类目前不支持 Qt 样式表 。我们计划在未来的某个版本中解决这个问题 。
类封装了 GUI 的通用外观 。
这个抽象类实现了作为 Qt 的一部分提供和交付的所有 GUI 样式所共有的一些小部件的外观和感觉 。
由于继承了  , 它的所有功能都完整地记录在文档中 。
qt实现了跨平台 , 在不同的平台下 , 控件的样式绘制成该平台的风格 。在qt的内部 , 如平台 , (路径:src\\\.h) 继承  , 完成风格的绘制 , 同理mac,linux
类是一个抽象基类 , 它封装了 GUI 的外观 。使用 () 函数和一个标识样式的键创建一个对象 。样式要么是内置的 , 要么是从样式插件动态加载的(参见 ) 。
可以使用 keys() 函数检索有效密钥 。通常它们包括“”和“” 。根据平台 , “”和“”可能可用 。请注意 , 键不区分大小写 。
QStringList key_list =QStyleFactory::keys();qDebug() << key_list;//"Windows", "WindowsXP", "WindowsVista", "Fusion"
类提供了当前可应用的所有风格实现,在系统上我获得如下几种风格:
我们可以通过::keys()和::()来获取这些可用的风格并且设置到需要的上用以改变GUI风格 。
Demo
以为例:
首先我们要来讲讲GUI控件结构 , 这里以为例:
一个完整的控件由一种或多种GUI元素构成:

qt-渲染原理

文章插图
sub .on where the userthem with the mouse and whichkeys are .
(简称CC)包含子控件 。根据用户对鼠标和键盘的不同处理 , CC控件的表现也不同 。上图中的仅包含一个CC控件 , 该复杂控件又包含三个子控件(SC , Sub )、、 。
Aanorto the user.
控件元素与用户交互相关 , 例如、等等 。只有一个用以在左侧展示当前选中或者正在编辑的文字 。