QT6 源(43):QGroupBox 的源码 : QWidget ,验证属性 flat 。以及宏定义 QT_REQUIRE_CONFIG(..)、QT_CONFIG(...)

(1)源码来自于头文件 qgroupbox . h

#ifndef QGROUPBOX_H
#define QGROUPBOX_H

#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qframe.h>

/*
QT_CONFIG宏实现了对 Qt特性的安全编译时检查。特性可以处于三种状态:
0 或未定义:在测试时会引发编译错误
-1:该功能不可用
1:该功能可用
    The QT_CONFIG macro implements a safe compile time check for features of Qt.
    Features can be in three states:
        0 or undefined: This will lead to a compile error when testing for it
        -1: The feature is not available
        1: The feature is available
*/
#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)

#define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1,\
 "Required feature " #feature " for file " __FILE__ " not available.")

QT_REQUIRE_CONFIG(groupbox);  //这里是在编译前确保本模块的源码已存在。模块化编程

QT_BEGIN_NAMESPACE //说明本容器定义在 QT 的全局空间里

class QGroupBoxPrivate;
class QStyleOptionGroupBox;

class Q_WIDGETS_EXPORT QGroupBox : public QWidget //所有控件的基类
{
    Q_OBJECT //又插入了这个宏,以释放一些成员函数与成员方法

    //此属性包含组框标题文本。 没有默认的标题文本。
    //如果标题包含一个连字符ampersand(&)和一个字母,则组框标题文本将具有键盘快捷键。
    //  g->setTitle("&User information");
    //在上面的例子中,Alt+U 将键盘焦点移动到组框。
    //请参阅 QShortcut 文档以获取详细信息(要显示实际的等号,请使用'&&')。
    Q_PROPERTY(QString title READ title WRITE setTitle)

    Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment)
    //此属性包含组框标题的对齐方式。
    //大多数样式将标题放在框架的顶部。可以使用以下列表中的单个值指定标题的水平对齐方式:
    //Qt::AlignLeft 将标题文本与组框的左侧对齐。
    //Qt::AlignRight 将标题文本与组框的右侧对齐。
    //Qt::AlignHCenter将标题文本与组框的水平中心对齐。

    //此属性表示组框是平涂 painted flat还是带有边框.
    //-个组框通常由一个周围的框架组成,顶部有一个标题。
    //如果启用了此属性,则大多数样式只会绘制框架的顶部;否则,会绘制整个框架。
    //默认情况下,此属性被禁用,即除非明确指定,否则组框不是扁平的。
    //注:在某些样式中,扁平和非扁平的组框具有类似的表示方式,可能不像其他样式中那样明显区分。
    Q_PROPERTY(bool flat READ isFlat WRITE setFlat)

    //这个属性表示组框的标题中是否有一个复选框。
    //如果此属性为真,则组框使用复选框显示其标题,而不是使用普通标。
    //如果复选框被选中,则组框的子项被启用;否则,它们被禁用且不可访问。
    //默认情况下,组框不可勾选。
    //如果为组框启用了此属性,则也会首先进行检查,以确保其内容已启用。
    Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable)

    Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY toggled USER true)
    //此属性表示组框是否已选中.
    //如果组框是可检查的,则显示带有复选框。
    //如果复选框被选中,则组框的子项被启用;否则,子项被禁用,用户无法访问。
    //默认情况下,可检查的复选框也会被选中。
private:
    Q_DISABLE_COPY(QGroupBox)
    Q_DECLARE_PRIVATE(QGroupBox)
    Q_PRIVATE_SLOT(d_func(), void _q_setChildrenEnabled(bool b))

public:
    //Constructs a group box widget with the given parent but with no title.
    explicit QGroupBox(QWidget *parent = nullptr); //构造函数

    explicit QGroupBox(const QString &title, QWidget *parent = nullptr);
    //Constructs a group box with the given title and parent.

    ~QGroupBox();

    QSize minimumSizeHint() const override;

//Q_PROPERTY(QString title READ title WRITE setTitle)
    QString title() const;
    void setTitle(const QString &title);

//Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment)
    Qt::Alignment alignment() const;
    void       setAlignment(int alignment);

//Q_PROPERTY(bool flat READ isFlat WRITE setFlat)
    bool  isFlat() const;
    void setFlat(bool flat);

//Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable)
    bool  isCheckable() const;
    void setCheckable(bool checkable);

//Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY toggled USER true)
    bool isChecked() const;
public Q_SLOTS:
    void setChecked(bool checked);

Q_SIGNALS:
    //这个信号是在复选框被激活时发出的(即,当鼠标光标在按钮内时按下然后释放),
    //或者当快捷键被键入时发出的。值得注意的是,如果调用setChecked(),则不会发出此信号。
    //如果选中复选框,则 checked 为 true;如果未选中复选框,则 checked 将为 false。
    void clicked(bool checked = false);

    void toggled(bool on);
    //如果复选框是可检查的,则在切换复选框时发出此信号。
    //如果复选框被选中,则on为true;否则,为false
    //注:已检查属性的通知信号。

protected: //只可以被子类使用,外部不可用
    //使用本 QGroupBox的值初始化 option。
    //当子类需要 QStyleOptionGroupBox但不希望自己填充所有信息时,此方法非常有用。
    virtual void initStyleOption(QStyleOptionGroupBox *option) const;

    bool        event(QEvent       *event) override; //全是继承来的事件
    void   childEvent(QChildEvent  *event) override;
    void  resizeEvent(QResizeEvent *event) override;
    void   paintEvent(QPaintEvent  *event) override;

    void  changeEvent(QEvent *event) override;
    void focusInEvent(QFocusEvent *event) override;

    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;

};

QT_END_NAMESPACE

#endif // QGROUPBOX_H

(2) 验证属性 flat,看看此属性不同时,绘制的 QGroupBox 的外观有何区别

在这里插入图片描述

(3)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值