Qt Creator源码分析系列——UI界面:StyleBar类

该篇文章内容主要集中Qt Creator软件界面部分代码的分析。从分析插件中的styledbar模块开始,项目文件在路径\qt-creator-master\qt-creator-master\src\libs\utils\utils-lib下。

StyleBar类

StyleBar类是Qt Creator界面中比较简单的类,其包含utils_global.h文件和QWidget文件。而utils_global.h和QTCREATOR_UTILS_EXPORT宏有关。

class QTCREATOR_UTILS_EXPORT StyledBar : public QWidget
{
    Q_OBJECT
public:
    StyledBar(QWidget *parent = nullptr);
    void setSingleRow(bool singleRow);
    bool isSingleRow() const;
    void setLightColored(bool lightColored);
    bool isLightColored() const;
protected:
    void paintEvent(QPaintEvent *event) override;
};

从类的声明中可以看出其继承自QWidget,没有自定义的成员变量,只有成员函数。在类实现文件中,包含了QPainter和QStyleOption头文件。
先看构造函数如下:

StyledBar::StyledBar(QWidget *parent) : QWidget(parent)
{
    setProperty("panelwidget", true);
    setProperty("panelwidget_singlerow", true);
    setProperty("lightColored", false);
}

构造函数设置了属性panelwidget为true,panelwidget_singlerow为true,lightColored为fasle。
在这里插入图片描述
将对象的name属性的值设置为value。如果使用Q_PROPERTY在类中定义了属性,则成功时返回true,否则返回false。 如果该属性未使用Q_PROPERTY定义,因此未在元对象meta-object中列出,则将其作为动态属性添加并返回false。
通过metaObject()和dynamicPropertyNames()提供有关所有可用属性的信息。
可以使用property()再次查询动态属性,并且可以通过将属性值设置为无效的QVariant来将其删除。 更改动态属性的值会导致将QDynamicPropertyChangeEvent发送到对象。

setSingleRow和isSingleRow、setLightColored和isLightColored就是对上述属性的设置和查询函数。

void StyledBar::setSingleRow(bool singleRow)
{
    setProperty("panelwidget_singlerow", singleRow);
}

bool StyledBar::isSingleRow() const
{
    return property("panelwidget_singlerow").toBool();
}

这里setLightColored函数比上一个多了foreach代码。—》下面会介绍Qt的QStyle类
在这里插入图片描述
初始化给定窗口小部件的外观。在完全创建完某个部件之后,在第一次显示该部件之前的某个时刻,每个部件都会调用此函数。请注意,默认实现不执行任何操作。 此函数中的合理操作可能是为该窗口小部件调用QWidget :: setBackgroundMode()函数。 请勿使用该功能来设置几何形状。 重新实现此功能提供了一个后门,通过该后门可以更改小部件的外观,但是对于Qt的样式引擎而言,很少需要实现此功能。 重新实现drawItemPixmap(),drawItemText(),drawPrimitive()等。
QWidget :: inherits()函数可以提供足够的信息以允许特定于类的自定义。 但是,由于期望新的QStyle子类可以在所有当前和将来的窗口小部件中合理地工作,因此建议限制使用硬编码的自定义项。

bool StyledBar::isLightColored() const
{
    return property("lightColored").toBool();
}
void StyledBar::setLightColored(bool lightColored)
{
    if (isLightColored() == lightColored)
        return;
    setProperty("lightColored", lightColored);
    foreach (QWidget *childWidget, findChildren<QWidget *>())
        childWidget->style()->polish(childWidget);
}

paintEvent就是该类的绘制事件

void StyledBar::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    QStyleOptionToolBar option;
    option.rect = rect();
    option.state = QStyle::State_Horizontal; //用于指示小部件是否水平放置
    style()->drawControl(QStyle::CE_ToolBar, &option, &painter, this);
}

QStyleOptionToolBar类用于描述绘制工具栏的参数。QStyleOptionToolBar包含QStyle函数绘制QToolBar所需的所有信息
出于性能原因,直接访问成员变量(即使用.或->运算符)。这种低级的感觉使结构易于使用,并强调这些只是样式函数使用的参数。QStyleOptionToolBar类包含用于绘制窗口小部件的lineWidth和midLineWidth。它还存储有关工具栏应位于哪个区域,是否可移动,工具栏线应具有的位置(positionOfLine)以及工具栏在该线内的位置的信息。此外,该类还提供了两个枚举:ToolBarFeature枚举用于描述工具栏是否可移动,而ToolBarPosition枚举用于描述工具栏行的位置以及该工具栏在行中的位置。

在这里插入图片描述
使用提供的painter绘制给定元素,其中painter由option指定。widget参数是可选的,可用于帮助绘制控件。 option参数是指向QStyleOption对象的指针,该对象可以使用qstyleoption_cast()函数强制转换为正确的子类。
下表列出了控件元素及其关联的样式选项子类。 样式选项包含绘制控件所需的所有参数,包括QStyleOption :: state,其中包含绘制时使用的样式标志。 该表还描述了将给定选项转换为适当的子类时设置的标志。
请注意,如果此处未列出控件元素,则是因为它使用了普通的QStyleOption对象。
这里不给出表的所有内容,详细参考手册。
在这里插入图片描述

---------》
QStyle类是一个抽象基类,它封装了GUI的外观。Qt包含一组QStyle子类,这些子类可模拟Qt支持的不同平台(QWindowsStyle,QMacStyle等)的样式。 默认情况下,这些样式内置在Qt GUI模块中。 样式也可以作为插件使用。Qt的内置窗口小部件使用QStyle来执行几乎所有图形绘制,从而确保它们看起来完全等同于等效的本机窗口小部件
下图显示了九种不同样式的QComboBox。
在这里插入图片描述
开发感知样式的自定义小部件:
如果您正在开发自定义窗口小部件,并希望它们在所有平台上都看起来不错,则可以使用QStyle函数执行窗口小部件绘制的各个部分,例如drawItemText(),drawItemPixmap(),drawPrimitive(),drawControl()和drawComplexControl( )。
大多数QStyle绘制函数采用四个参数:

  • 一个枚举值,指定要绘制的图形元素
  • 一个QStyleOption指定如何以及在哪里渲染该元素
  • 一个QPainter应该用来绘制元素
  • 在其上执行绘图的QWidget(可选)
    QStyle从QStyleOption获取渲染图形元素所需的所有信息。 如果样式需要其执行特殊效果(例如macOS上的动画默认按钮),则将该小部件作为最后一个参数传递,但这不是强制性的。 实际上,通过正确设置QPainter,您可以使用QStyle在任何绘画设备上绘画,而不仅仅是小部件。QStyleOption具有各种子类,可用于绘制各种类型的图形元素。 例如,PE_FrameFocusRect需要一个QStyleOptionFocusRect参数。
    为了确保绘制操作尽可能快,QStyleOption及其子类具有公共数据成员。 有关如何使用它的详细信息,请参见QStyleOption类文档。在这里插入图片描述

StyledSeparator

更简单的一个类:

class QTCREATOR_UTILS_EXPORT StyledSeparator : public QWidget
{
    Q_OBJECT
public:
    StyledSeparator(QWidget *parent = nullptr);
protected:
    void paintEvent(QPaintEvent *event) override;
};
StyledSeparator::StyledSeparator(QWidget *parent) : QWidget(parent)
{
    setFixedWidth(10);
}
void StyledSeparator::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    QStyleOption option;
    option.rect = rect();
    option.state = QStyle::State_Horizontal;
    option.palette = palette();
    style()->drawPrimitive(QStyle::PE_IndicatorToolBarSeparator, &option, &painter, this);
}

在这里插入图片描述
使用option指定的样式选项,使用提供的绘画工具绘制给定的基本元素。小部件参数是可选的,并且可以包含可帮助绘制基本元素的小部件。

发布了101 篇原创文章 · 获赞 108 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/asmartkiller/article/details/104350744