Qt QStyle详解

Qt QStyle详解

1.简介

QStyle类是 Qt 框架中用于控制应用程序界面元素外观的一个抽象基类。这个类提供了一种方式来定制窗口部件(widgets)的绘制和行为,可以通过改变主题或风格来更改应用程序的外观,而无需修改窗口部件本身的代码。

Qt包含一组QStyle子类,这些子类模仿Qt支持的不同平台的样式(QWindowsStyle、QMacStyle等)。默认情况下,这些样式内置在Qt GUI模块中。样式也可以作为插件提供。 Qt的内置widget使用QStyle来执行几乎所有的绘制,确保它们看起来与等效的本地小部件完全相同。下图显示了九种不同样式的QComboBox。

QStyle 的主要方法:

drawControl(): 绘制控制元素,如复选框、按钮等。

drawPrimitive(): 绘制基本元素,如滚动条的箭头、框架等。

drawComplexControl(): 绘制复杂的控制元素,如组合框或滚动条。

sizeFromContents(): 根据内容计算控件的大小。

subElementRect(): 返回控件子元素的矩形区域。

styleHint(): 提供关于如何绘制或行为的提示。

pixelMetric(): 返回关于控件的一些基本尺寸的信息,如滚动条的宽度等。

2.如何使用QStyle

由于QStyle是一个抽象类,你不能直接实例化它。Qt 提供了一些内置的风格类,如 QWindowsStyle,QMacStyle等,你可以直接使用这些预定义的风格或者继承QStyle创建自定义风格。

QStyleFactory提供了一个静态方法create(),该方法接受一个字符串参数,该参数表示要创建的样式的名称。

#include "mainwindow.h"

#include

#include

#include

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

qDebug()<

// 设置应用程序的风格

QApplication::setStyle(QStyleFactory::create("Fusion"));

MainWindow w;

w.show();

return a.exec();

}

在这个例子中,我们使用QStyleFactory来创建一个 “Fusion” 风格,并将其设置为应用程序的当前风格。

QStyleFactory还提供了一个静态方法keys(),该方法返回一个字符串列表,包含了工厂知道如何创建的所有样式的名称。这可以用来列出所有可用的样式:

QStringList styles = QStyleFactory::keys();

for (const QString &style : styles) {

qDebug() << "Available style:" << style;

}

除了上面的使用setStyle方法来加载样式以为,还提供以下方式来加载样式。

./myapplication -style windows

3.自定义风格

如果您正在开发自定义widget,并希望它们在所有平台上看起来都很好,则可以使用QStyle函数来执行小部件绘图的部分,如drawItemText()、drawItemPixmap()、drawPrimitive()、drawControl()和drawComplexControl()。

大多数QStyle绘制函数都有四个参数:

PrimitiveElement:指定要绘制的图形元素的枚举值

QStyleOption:指定如何以及在何处渲染该元素。

QPainter:画家

QWidget:可选,在哪个widget上绘制。

例子:如果你想在你的widget上画一个焦点矩形,你可以写:

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);

}

示例:自定义QSpinBox,绘制上下指针。使用PE_IndicatorSpinUp和PE_IndicatorSpinDown。

运行结果前后对比:

源码:自定义CustomStyle。

#ifndef CUSTOMSTYLE_H

#define CUSTOMSTYLE_H

#include

#include

#include

class CustomStyle : public QProxyStyle

{

public:

CustomStyle();

void drawPrimitive(PrimitiveElement element, const QStyleOption *option,

QPainter *painter, const QWidget *widget) const;

};

#endif // CUSTOMSTYLE_H

#include "customstyle.h"

CustomStyle::CustomStyle()

{

}

void CustomStyle::drawPrimitive(QStyle::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;

相关推荐

王者荣耀最高冷却缩减上限可以达到多少(上限都是40%吗)
KN95口罩9天涨价六倍!各地纷纷出台平抑措施
365bet亚洲最大网投

KN95口罩9天涨价六倍!各地纷纷出台平抑措施

📅 07-03 👍 627
刘仰:和尚打伞,无法无天
365bet亚洲最大网投

刘仰:和尚打伞,无法无天

📅 07-08 👍 518
十大手机识图软件排行 拍照识图app哪个好用 免费识图搜图软件推荐→榜中榜
十大好用的抢火车票软件 抢票软件哪个成功率高 自动抢票app推荐→榜中榜
摩拜单车如何入驻,摩拜单车入驻攻略,如何成为共享经济的领军者