C++界面开发框架Qt 6.x入门级教程:Qt Widget- 样式和样式感知小部件(四)

样式(继承QStyle的类)代表小部件绘制并封装 GUI 的外观。 QStyle 类是一个抽象基类,它封装了 GUI 的外观。

样式选项

QStyleOption 的子类包含设置各个元素样式所需的所有信息,样式选项被实例化 – 通常在堆栈上 – 并由QStyle函数的调用者填写。根据绘制的内容,样式将期望不同的样式选项类。 例如,QStyle::PE_FrameFocusRect 元素需要一个QStyleOptionFocusRect 参数,并且可以创建自定义样式可以使用的自定义子类。 出于性能原因,样式选项保留公共变量。

小部件可以处于许多不同的状态,这些状态由State枚举定义。 一些状态标志根据小部件具有不同的含义,但其他状态标志对于所有小部件都是通用的,例如 State_Disabled。 使用QStyleOption::initFrom(); 设置公共状态的是QStyleOption; 其余状态由各个小部件设置。

最值得注意的是,样式选项包含要绘制的小部件调色板和边界矩形,大多数小部件都有专门的样式选项。 例如,QPushButton和QCheckBox使用QStyleOptionButton作为样式选项,其中包含文本、图标和图标的大小。 当我们浏览各个小部件时,将描述所有选项的确切内容。

在重新实现带有QStyleOption参数的QStyle函数时,您通常需要将QStyleOption 强制转换为子类(例如,QStyleOptionFocusRect)。 为了安全起见,您可以使用qstyleoption_cast()来确保指针类型正确。 如果对象的类型不正确,qstyleoption_cast() 返回 nullptr, 例如:

const QStyleOptionFocusRect *focusRectOption =qstyleoption_cast<const QStyleOptionFocusRect *>(option);if (focusRectOption) {...}

以下代码片段说明了如何使用 QStyle 从自定义小部件的 paintEvent() 中绘制焦点矩形:

void MyWidget::paintEvent(QPaintEvent *event){QPainter painter(this);...QStyleOptionFocusRect option(1);option.init(this);option.backgroundColor = palette().color(QPalette::Window);style().drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter,this);}

下一个示例显示如何从现有样式派生以自定义图形元素的外观:

class CustomStyle : public QProxyStyle{Q_OBJECTpublic:CustomStyle(const QWidget *widget);~CustomStyle() {}void drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const override;};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);}}
Qt商用组件推荐
  • QtitanRibbon – Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart – Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanNavigation:QtitanNavigationDesignUI 组件是一组 GUI 控件,它实现了菜单、导航框、命令栏等导航界面,并让您以更少的滚动和点击次数有效地查看所有实体(工作区、 格或其他项目)。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!

Qt技术交流群:166830288      欢迎一起进群讨论

更多Qt产品教程、下载、正版授权资讯,请点击获取

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月12日
下一篇 2022年5月12日

相关推荐

发表回复

登录后才能评论