Browse Source

button first commit

lennlouis 1 month ago
commit
3ef7675b31

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+build/

+ 319 - 0
QAntButton/QAntAbstractButton.cpp

@@ -0,0 +1,319 @@
+//
+// Created by Louis on 25-4-1.
+//
+
+#include "QAntAbstractButton.h"
+
+QAntAbstractButton::QAntAbstractButton(QWidget *parent) : QWidget(parent) {
+	setAttribute(Qt::WA_Hover);
+    // // 设置布局方案
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+	setCursor(Qt::PointingHandCursor);
+    setAttribute(Qt::WA_TranslucentBackground);
+    setStyleSheet("QWidget { border: none; background: transparent; }");
+    // setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
+
+    // 创建阴影效果
+    m_shadowEffect = new QGraphicsDropShadowEffect(this);
+    m_shadowEffect->setBlurRadius(0);
+    m_shadowEffect->setColor(Qt::transparent);
+    m_shadowEffect->setOffset(0, 0);
+    setGraphicsEffect(m_shadowEffect);
+
+    // 创建动画组
+    m_animationGroup = new QParallelAnimationGroup(this);
+    
+    // 创建模糊半径动画
+    QPropertyAnimation* blurAnimation = new QPropertyAnimation(m_shadowEffect, "blurRadius", this);
+    blurAnimation->setDuration(300);
+    blurAnimation->setStartValue(0);
+    blurAnimation->setEndValue(25);
+    blurAnimation->setEasingCurve(QEasingCurve::OutQuad);
+    m_animationGroup->addAnimation(blurAnimation);
+
+    // 创建颜色动画
+    QPropertyAnimation* colorAnimation = new QPropertyAnimation(m_shadowEffect, "color", this);
+    colorAnimation->setDuration(300);
+    colorAnimation->setEasingCurve(QEasingCurve::OutQuad);
+    m_animationGroup->addAnimation(colorAnimation);
+
+    connect(m_animationGroup, &QParallelAnimationGroup::finished, this, [this]() {
+        m_shadowEffect->setColor(Qt::transparent);
+        m_shadowEffect->setBlurRadius(0);
+    });
+}
+
+QAntAbstractButton::~QAntAbstractButton() {
+    if (m_animationGroup) {
+        delete m_animationGroup;
+        m_animationGroup = nullptr;
+    }
+    if (m_shadowEffect) {
+        delete m_shadowEffect;
+        m_shadowEffect = nullptr;
+    }
+}
+
+QString QAntAbstractButton::text() const {
+	return m_text;
+}
+
+void QAntAbstractButton::setText(const QString &text) {
+	if (text != m_text) {
+		m_text = text;
+		update();
+		emit textChanged(text);
+	}
+}
+
+QIcon QAntAbstractButton::icon() const {
+	return m_icon;
+}
+
+void QAntAbstractButton::setIcon(const QIcon &icon) {
+	if (icon.cacheKey() != m_icon.cacheKey()) {
+		m_icon = icon;
+		update();
+		emit iconChanged(icon);
+	}
+}
+
+QSize QAntAbstractButton::iconSize() const {
+	return m_iconSize;
+}
+
+void QAntAbstractButton::setIconSize(const QSize &size) {
+	if (m_iconSize != size) {
+		m_iconSize = size;
+		updateGeometry();
+		update();
+	}
+}
+
+QMargins QAntAbstractButton::padding() const {
+	return m_padding;
+}
+
+void QAntAbstractButton::setPadding(const QMargins &margins) {
+	if (m_padding != margins) {
+		m_padding = margins;
+		updateGeometry();
+		update();
+	}
+}
+
+QAntAbstractButton::ButtonState QAntAbstractButton::currentState() const {
+	return m_state;
+}
+
+void QAntAbstractButton::paintText(QPainter &painter, const QRect &textRect) {
+	painter.save();
+	painter.setPen(palette().color(foregroundRole()));
+	painter.setFont(font());
+	painter.drawText(textRect, Qt::AlignCenter, m_text);
+	painter.restore();
+}
+
+void QAntAbstractButton::paintIcon(QPainter &painter, const QRect &iconRect) {
+	QIcon::Mode mode = QIcon::Normal;
+	if (!isEnabled()) {
+		mode = QIcon::Disabled;
+	}
+	else if (m_state == PressedState) {
+		mode = QIcon::Selected;
+	}
+
+	m_icon.paint(&painter, iconRect, Qt::AlignCenter, mode);
+}
+
+void QAntAbstractButton::paintFocusIndicator(QPainter &painter) {
+	painter.save();
+	QPen pen(palette().highlight(), 1, Qt::DotLine);
+	painter.setPen(pen);
+	painter.setBrush(Qt::NoBrush);
+	painter.drawRect(rect().adjusted(1, 1, -1, -1));
+	painter.restore();
+}
+
+void QAntAbstractButton::paintBackground(QPainter &painter) {
+    painter.fillRect(rect(), Qt::transparent);
+}
+
+void QAntAbstractButton::paintBorder(QPainter &painter) {
+    // 移除边框绘制
+    painter.save();
+    QPen pen(palette().shadow(), 1);
+    painter.setPen(pen);
+    painter.setBrush(Qt::NoBrush);
+    painter.drawRect(rect().adjusted(0, 0, -1, -1));
+    painter.restore();
+}
+
+QRect QAntAbstractButton::calculateTextRect(const QRect &contentsRect) const {
+	QFontMetrics fm(font());
+	QRect textRect = fm.boundingRect(contentsRect, Qt::AlignCenter, m_text);
+
+	if (!m_icon.isNull()) {
+		textRect.moveLeft(contentsRect.left() + m_iconSize.width() + 4);
+	}
+
+	return textRect;
+}
+
+QRect QAntAbstractButton::calculateIconRect(const QRect &contentsRect) const {
+	return QRect(contentsRect.left(), contentsRect.center().y() - m_iconSize.height() / 2,
+		m_iconSize.width(), m_iconSize.height());
+}
+
+void QAntAbstractButton::paintEvent(QPaintEvent *event) {
+	Q_UNUSED(event);
+
+	QPainter painter(this);
+    painter.setRenderHint(QPainter::Antialiasing);
+
+	paintBackground(painter);
+
+	switch (m_state) {
+		case NormalState:
+			paintNormalState(painter);
+			break;
+		case HoverState:
+			paintHoverState(painter);
+			break;
+		case PressedState:
+			paintPressedState(painter);
+			break;
+		case DisabledState:
+			paintDisabledState(painter);
+			break;
+		case LoadingState:
+			paintLoadingState(painter);
+			break;
+	}
+
+    // paintBorder(painter);
+
+	QRect contentsRect = rect().marginsRemoved(m_padding);
+
+	if (!m_icon.isNull() && m_state != LoadingState) {
+		QRect iconRect = calculateIconRect(contentsRect);
+		paintIcon(painter, iconRect);
+	}
+
+	if (!m_text.isEmpty() && m_state != LoadingState) {
+		QRect textRect = calculateTextRect(contentsRect);
+		paintText(painter, textRect);
+	}
+
+	if (hasFocus()) {
+		paintFocusIndicator(painter);
+	}
+}
+
+void QAntAbstractButton::mousePressEvent(QMouseEvent *event) {
+	if (event->button() == Qt::LeftButton && !m_loading && isEnabled()) {
+		m_mousePressed = true;
+		updateButtonState(PressedState);
+		emit pressed();
+		event->accept();
+	}
+}
+
+void QAntAbstractButton::mouseReleaseEvent(QMouseEvent *event) {
+	if (m_mousePressed && event->button() == Qt::LeftButton) {
+		m_mousePressed = false;
+
+		if (rect().contains(event->pos())) {
+			startRippleEffect();
+			emit clicked();
+			updateButtonState(HoverState);
+		} else {
+			updateButtonState(NormalState);
+		}
+	}
+	emit release();
+	event->accept();
+}
+
+void QAntAbstractButton::mouseMoveEvent(QMouseEvent *event) {
+	if (m_mousePressed) {
+		if (rect().contains(event->pos())) {
+			updateButtonState(PressedState);
+		}
+		else {
+			QWidget::mouseMoveEvent(event);
+		}
+	}
+}
+
+void QAntAbstractButton::enterEvent(QEnterEvent *event) {
+	if (isEnabled() && !m_loading && !m_mousePressed) {
+		updateButtonState(HoverState);
+	}
+	QWidget::enterEvent(event);
+}
+
+void QAntAbstractButton::leaveEvent(QEvent *event) {
+	if (isEnabled() && !m_loading) {
+		updateButtonState(NormalState);
+	}
+	QWidget::leaveEvent(event);
+}
+
+void QAntAbstractButton::focusInEvent(QFocusEvent *event) {
+	update();
+	QWidget::focusInEvent(event);
+}
+
+void QAntAbstractButton::focusOutEvent(QFocusEvent *event) {
+	update();
+	QWidget::focusOutEvent(event);
+}
+
+void QAntAbstractButton::changeEvent(QEvent *event) {
+	if (event->type() == QEvent::EnabledChange) {
+		if (isEnabled()) {
+			updateButtonState(NormalState);
+		}
+		else {
+			updateButtonState(DisabledState);
+		}
+		emit enabledChanged(isEnabled());
+	}
+	QWidget::changeEvent(event);
+}
+
+void QAntAbstractButton::updateButtonState(ButtonState newState) {
+	if (newState == m_state)
+		return;
+
+	ButtonState oldState = m_state;
+	m_state = newState;
+
+
+	update();
+}
+
+
+void QAntAbstractButton::startRippleEffect() {
+    // 设置初始状态
+    QColor effectColor = rippleColor();
+    effectColor.setAlpha(120);
+    m_shadowEffect->setColor(effectColor);
+    m_shadowEffect->setBlurRadius(0);
+
+    // 更新颜色动画
+    QPropertyAnimation* colorAnim = qobject_cast<QPropertyAnimation*>(m_animationGroup->animationAt(1));
+    if (colorAnim) {
+        effectColor.setAlpha(0);
+        colorAnim->setStartValue(m_shadowEffect->color());
+        colorAnim->setEndValue(effectColor);
+    }
+
+    // 开始动画组
+    m_animationGroup->start();
+}
+
+
+
+

+ 101 - 0
QAntButton/QAntAbstractButton.h

@@ -0,0 +1,101 @@
+//
+// Created by Louis on 25-4-1.
+//
+
+#ifndef QANTABSTRACTBUTTON_H
+#define QANTABSTRACTBUTTON_H
+#include <qwidget.h>
+#include <qpainter.h>
+#include <qicon.h>
+#include <qtimer.h>
+#include <qevent.h>
+#include <qfontmetrics.h>
+#include <QPropertyAnimation>
+#include <QGraphicsDropShadowEffect>
+#include <QParallelAnimationGroup>
+
+class QAntAbstractButton : public QWidget {
+	Q_OBJECT
+
+public:
+	enum ButtonState {
+		NormalState,
+		HoverState,
+		PressedState,
+		DisabledState,
+		LoadingState
+	};
+
+	Q_ENUM(ButtonState)
+
+	explicit QAntAbstractButton(QWidget* parent = nullptr);
+	virtual ~QAntAbstractButton();
+
+	QString text() const;
+	void setText(const QString& text);
+
+	QIcon icon() const;
+	void setIcon(const QIcon& icon);
+
+	QSize iconSize() const;
+	void setIconSize(const QSize& size);
+
+	QMargins padding() const;
+	void setPadding(const QMargins& margins);
+
+	ButtonState currentState() const;
+
+signals:
+	void clicked();
+	void pressed();
+	void release();
+	void textChanged(const QString& text);
+	void iconChanged(const QIcon& icon);
+	void enabledChanged(bool enabled);
+	void loadingChanged(bool loading);
+
+protected:
+	virtual void paintNormalState(QPainter& painter) = 0;
+	virtual void paintHoverState(QPainter& painter) = 0;
+	virtual void paintPressedState(QPainter& painter) = 0;
+	virtual void paintDisabledState(QPainter& painter) = 0;
+	virtual void paintLoadingState(QPainter& painter) = 0;
+
+	virtual void paintText(QPainter& painter, const QRect& textRect);
+	virtual void paintIcon(QPainter& painter, const QRect& iconRect);
+	virtual void paintFocusIndicator(QPainter& painter);
+	virtual void paintBackground(QPainter& painter);
+    virtual void paintBorder(QPainter &painter);
+	virtual QRect calculateTextRect(const QRect& contentsRect) const;
+	virtual QRect calculateIconRect(const QRect& contentsRect) const;
+
+	void paintEvent(QPaintEvent* event) override;
+	void mousePressEvent(QMouseEvent *event) override;
+	void mouseReleaseEvent(QMouseEvent *event) override;
+	void mouseMoveEvent(QMouseEvent *event) override;
+	void enterEvent(QEnterEvent *event) override;
+	void leaveEvent(QEvent *event) override;
+	void focusInEvent(QFocusEvent *event) override;
+	void focusOutEvent(QFocusEvent *event) override;
+	void changeEvent(QEvent *) override;
+
+	void updateButtonState(ButtonState newState);
+	virtual QColor rippleColor() const = 0;
+	void startRippleEffect();
+
+private:
+	QString m_text;
+	QIcon m_icon;
+	QSize m_iconSize = QSize(16, 16);
+	QMargins m_padding = QMargins(8, 4, 8, 4);
+	ButtonState m_state = NormalState;
+
+	bool m_loading = false;
+	bool m_mousePressed = false;
+	bool m_hasFocus = false;
+
+	QParallelAnimationGroup* m_animationGroup = nullptr;
+	QGraphicsDropShadowEffect* m_shadowEffect = nullptr;
+};
+
+#endif //QANTABSTRACTBUTTON_H

+ 7 - 0
QAntButton/QAntButton.pri

@@ -0,0 +1,7 @@
+HEADERS += \
+    $$PWD/QAntAbstractButton.h \
+    $$PWD/QAntPrimaryButton.h
+
+SOURCES += \
+    $$PWD/QAntAbstractButton.cpp \
+    $$PWD/QAntPrimaryButton.cpp

+ 187 - 0
QAntButton/QAntPrimaryButton.cpp

@@ -0,0 +1,187 @@
+//
+// Created by Louis on 25-4-1.
+//
+
+#include "QAntPrimaryButton.h"
+
+QAntPrimaryButton::QAntPrimaryButton(QWidget *parent) : QAntAbstractButton(parent) {
+    m_normalColor = QColor("#1677FF");
+    m_pressedColor = QColor("#0958D9");
+    m_hoverColor = QColor("#4096FF");
+    m_disabledColor = QColor("#F5F5F5");
+
+    m_textColor = Qt::white;
+    m_textDisabledColor = QColor("#BFBFBF");
+
+    m_xRadius = 8;
+    m_yRadius = 8;
+
+    m_borderWidth = 2;
+
+    setAttribute(Qt::WA_TranslucentBackground);
+}
+
+QAntPrimaryButton::~QAntPrimaryButton() {}
+
+QColor QAntPrimaryButton::normalColor() const {
+    return m_normalColor;
+}
+
+void QAntPrimaryButton::setNormalColor(const QColor &color) {
+    if (m_normalColor != color) {
+        m_normalColor = color;
+        update();
+    }
+}
+
+QColor QAntPrimaryButton::hoverColor() const {
+    return m_hoverColor;
+}
+
+void QAntPrimaryButton::setHoverColor(const QColor &color) {
+    if (m_hoverColor != color) {
+        m_hoverColor = color;
+        update();
+    }
+}
+
+QColor QAntPrimaryButton::pressedColor() const {
+    return m_pressedColor;
+}
+
+void QAntPrimaryButton::setPressedColor(const QColor &color) {
+    if (m_pressedColor != color) {
+        m_pressedColor = color;
+        update();
+    }
+}
+
+QColor QAntPrimaryButton::disabledColor() const {
+    return  m_disabledColor;
+}
+
+void QAntPrimaryButton::setDisabledColor(const QColor &color) {
+    if (color != m_disabledColor) {
+        m_disabledColor = color;
+        update();
+    }
+}
+
+QColor QAntPrimaryButton::textColor() const {
+    return m_textColor;
+}
+
+void QAntPrimaryButton::setTextColor(const QColor &color) {
+    if (m_textColor != color) {
+        m_textColor = color;
+        update();
+    }
+}
+
+QColor QAntPrimaryButton::textDisabledColor() const {
+    return m_textDisabledColor;
+}
+
+void QAntPrimaryButton::setTextDisabledColor(const QColor &color) {
+    if (m_textDisabledColor != color) {
+        m_textDisabledColor = color;
+        update();
+    }
+}
+
+qreal QAntPrimaryButton::xRadius() const {
+    return m_xRadius;
+}
+
+void QAntPrimaryButton::setXRadius(const qreal &x) {
+    if (m_xRadius != x) {
+        m_xRadius = x;
+        update();
+    }
+}
+
+qreal QAntPrimaryButton::yRadius() const {
+    return m_yRadius;
+}
+
+void QAntPrimaryButton::setYRadius(const qreal &y) {
+    if (m_yRadius != y) {
+        m_yRadius = y;
+        update();
+    }
+}
+
+qreal QAntPrimaryButton::borderWidth() const {
+    return m_borderWidth;
+}
+
+void QAntPrimaryButton::setBorderWidth(qreal &w) {
+    if (m_borderWidth != w) {
+        m_borderWidth = w;
+        update();
+    }
+}
+
+QSize QAntPrimaryButton::sizeHint()
+{
+    return QSize(200, 100);
+}
+
+void QAntPrimaryButton::paintNormalState(QPainter &painter) {
+    painter.setRenderHint(QPainter::Antialiasing);
+    QRectF btnRect = rect();
+    QPainterPath path;
+    path.addRoundedRect(btnRect, m_xRadius, m_yRadius);
+    painter.fillPath(path, m_normalColor);
+}
+
+void QAntPrimaryButton::paintHoverState(QPainter &painter) {
+    painter.setRenderHint(QPainter::Antialiasing);
+    QRectF btnRect = rect();
+    QPainterPath path;
+    path.addRoundedRect(btnRect, m_xRadius, m_yRadius);
+    painter.fillPath(path, m_hoverColor);
+}
+
+void QAntPrimaryButton::paintPressedState(QPainter &painter) {
+    painter.setRenderHint(QPainter::Antialiasing);
+    QRectF btnRect = rect();
+    QPainterPath path;
+    path.addRoundedRect(btnRect, m_xRadius, m_yRadius);
+    painter.fillPath(path, m_pressedColor);
+}
+
+void QAntPrimaryButton::paintDisabledState(QPainter &painter) {
+    painter.setRenderHint(QPainter::Antialiasing);
+    QRectF btnRect = rect();
+    QPainterPath path;
+    path.addRoundedRect(btnRect, m_xRadius, m_yRadius);
+    painter.fillPath(path, m_disabledColor);
+
+    QPen pen(m_textDisabledColor, m_borderWidth);
+    pen.setJoinStyle(Qt::MiterJoin);
+    painter.setPen(pen);
+    painter.setBrush(Qt::NoBrush);
+
+    QPainterPath borderPath;
+    QRectF borderRect = btnRect.adjusted(m_borderWidth / 2, m_borderWidth / 2,
+        -m_borderWidth / 2, -m_borderWidth / 2);
+    borderPath.addRoundedRect(borderRect, m_xRadius, m_yRadius);
+    painter.drawPath(borderPath);
+}
+
+void QAntPrimaryButton::paintLoadingState(QPainter &painter) {}
+
+void QAntPrimaryButton::paintText(QPainter &painter, const QRect &textRect) {
+    painter.save();
+    QColor textColor = isEnabled() ? m_textColor : m_textDisabledColor;
+    painter.setPen(textColor);
+    painter.setFont(font());
+    painter.drawText(textRect, Qt::AlignCenter, text());
+    painter.restore();
+}
+
+QColor QAntPrimaryButton::rippleColor() const {
+    return m_normalColor.lighter(120); // 使用主题色的亮版本作为光晕颜色
+}
+

+ 76 - 0
QAntButton/QAntPrimaryButton.h

@@ -0,0 +1,76 @@
+//
+// Created by Louis on 25-4-1.
+//
+
+#ifndef QANTPRIMARYBUTTON_H
+#define QANTPRIMARYBUTTON_H
+
+#include "QAntAbstractButton.h"
+#include <QPainterPath>
+#include <QtDesigner/QDesignerExportWidget>
+
+class QAntPrimaryButton : public QAntAbstractButton{
+	Q_OBJECT
+
+public:
+	explicit QAntPrimaryButton(QWidget* parent = nullptr);
+    ~QAntPrimaryButton();
+
+	QColor normalColor() const;
+	void setNormalColor(const QColor& color);
+
+	QColor hoverColor() const;
+	void setHoverColor(const QColor& color);
+
+	QColor pressedColor() const;
+	void setPressedColor(const QColor& color);
+
+	QColor disabledColor() const;
+	void setDisabledColor(const QColor& color);
+
+	QColor textColor() const;
+	void setTextColor(const QColor& color);
+
+	QColor textDisabledColor() const;
+	void setTextDisabledColor(const QColor& color);
+
+	qreal xRadius() const;
+	void setXRadius(const qreal& x);
+
+	qreal yRadius() const;
+	void setYRadius(const qreal& y);
+
+	qreal borderWidth() const;
+	void setBorderWidth(qreal& w);
+
+    QSize sizeHint();
+
+protected:
+	void paintNormalState(QPainter &painter) override;
+	void paintHoverState(QPainter &painter) override;
+	void paintPressedState(QPainter &painter) override;
+	void paintDisabledState(QPainter &painter) override;
+	void paintLoadingState(QPainter &painter) override;
+
+	void paintText(QPainter &painter, const QRect &textRect) override;
+
+	QColor rippleColor() const override;
+
+private:
+	QColor m_normalColor;
+	QColor m_pressedColor;
+	QColor m_hoverColor;
+	QColor m_disabledColor;
+
+	QColor m_textColor;
+	QColor m_textDisabledColor;
+
+	qreal m_xRadius;
+	qreal m_yRadius;
+
+	qreal m_borderWidth;
+};
+
+
+
+#endif //QANTPRIMARYBUTTON_H

+ 12 - 0
main.cpp

@@ -0,0 +1,12 @@
+#include "widget.h"
+
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+    QApplication a(argc, argv);
+    Widget w;
+    w.show();
+    return a.exec();
+}

+ 28 - 0
qt-ant-ui.pro

@@ -0,0 +1,28 @@
+QT       += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+CONFIG += c++17
+
+# You can make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+    main.cpp \
+    widget.cpp
+
+HEADERS += \
+    widget.h
+
+FORMS += \
+    widget.ui
+
+INCLUDEPATH += $$PWD
+INCLUDEPATH += $$PWD/QAntButton
+include($$PWD/QAntButton/QAntButton.pri)
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target

+ 518 - 0
qt-ant-ui.pro.user

@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 14.0.2, 2025-04-02T00:09:23. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{4f2ec396-c2e0-4f3d-a369-5968ecaf5cee}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="qlonglong">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
+   <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
+   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="bool" key="EditorConfiguration.UseIndenter">false</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+   <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap">
+   <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
+    <value type="bool" key="AutoTest.Framework.Boost">true</value>
+    <value type="bool" key="AutoTest.Framework.CTest">false</value>
+    <value type="bool" key="AutoTest.Framework.Catch">true</value>
+    <value type="bool" key="AutoTest.Framework.GTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtTest">true</value>
+   </valuemap>
+   <value type="bool" key="AutoTest.ApplyFilter">false</value>
+   <valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
+   <valuelist type="QVariantList" key="AutoTest.PathFilters"/>
+   <value type="int" key="AutoTest.RunAfterBuild">0</value>
+   <value type="bool" key="AutoTest.UseGlobal">true</value>
+   <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
+    <value type="QString">-fno-delayed-template-parsing</value>
+   </valuelist>
+   <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
+   <valuemap type="QVariantMap" key="ClangTools">
+    <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
+    <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
+    <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
+    <value type="int" key="ClangTools.ParallelJobs">16</value>
+    <value type="bool" key="ClangTools.PreferConfigFile">true</value>
+    <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
+    <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
+    <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
+    <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
+   </valuemap>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="DeviceType">Desktop</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.7.3 MinGW 64-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.7.3 MinGW 64-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.673.win64_mingw_kit</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Workspaces\qt-ant-ui\build\Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Workspaces/qt-ant-ui/build/Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Workspaces\qt-ant-ui\build\Desktop_Qt_6_7_3_MinGW_64_bit-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Workspaces/qt-ant-ui/build/Desktop_Qt_6_7_3_MinGW_64_bit-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Workspaces\qt-ant-ui\build\Desktop_Qt_6_7_3_MinGW_64_bit-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Workspaces/qt-ant-ui/build/Desktop_Qt_6_7_3_MinGW_64_bit-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+    <value type="int" key="SeparateDebugInfo">0</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
+    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="QList&lt;int&gt;" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
+    <valuelist type="QVariantList" key="CustomOutputParsers"/>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
+    <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/Workspaces/qt-ant-ui/qt-ant-ui.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Workspaces/qt-ant-ui/qt-ant-ui.pro</value>
+    <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Workspaces/qt-ant-ui/build/Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.1</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win64_mingw73_kit</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/Workspaces/build-qt-ant-ui-Desktop_Qt_5_14_2_MinGW_64_bit-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/Workspaces/build-qt-ant-ui-Desktop_Qt_5_14_2_MinGW_64_bit-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/Workspaces/build-qt-ant-ui-Desktop_Qt_5_14_2_MinGW_64_bit-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.Events">
+     <value type="QString">cpu-cycles</value>
+    </valuelist>
+    <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
+    <value type="int" key="Analyzer.Perf.Frequency">250</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
+     <value type="QString">-e</value>
+     <value type="QString">cpu-cycles</value>
+     <value type="QString">--call-graph</value>
+     <value type="QString">dwarf,4096</value>
+     <value type="QString">-F</value>
+     <value type="QString">250</value>
+    </valuelist>
+    <value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Perf.StackSize">4096</value>
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/Workspaces/qt-ant-ui/qt-ant-ui.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Workspaces/qt-ant-ui/qt-ant-ui.pro</value>
+    <value type="QString" key="RunConfiguration.Arguments"></value>
+    <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
+    <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Workspaces/build-qt-ant-ui-Desktop_Qt_5_14_2_MinGW_64_bit-Debug</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="qlonglong">2</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">22</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">22</value>
+ </data>
+</qtcreator>

+ 28 - 0
widget.cpp

@@ -0,0 +1,28 @@
+#include "widget.h"
+#include "ui_widget.h"
+#include <QHBoxLayout>
+
+Widget::Widget(QWidget *parent)
+    : QWidget(parent)
+    , ui(new Ui::Widget)
+{
+    ui->setupUi(this);
+    setAttribute(Qt::WA_TranslucentBackground);
+    setStyleSheet("QWidget { background: transparent; }");
+
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->setContentsMargins(50, 50, 50, 50);
+    layout->setSpacing(0);
+
+    priBtn = new QAntPrimaryButton(this);
+    priBtn->setText("Hello world");
+    priBtn->setFixedSize(200, 100);
+    layout->addWidget(priBtn, 0, Qt::AlignCenter);
+
+    setLayout(layout);
+}
+
+Widget::~Widget()
+{
+    delete ui;
+}

+ 27 - 0
widget.h

@@ -0,0 +1,27 @@
+#ifndef WIDGET_H
+#define WIDGET_H
+
+#include <QWidget>
+#include "QAntPrimaryButton.h"
+
+QT_BEGIN_NAMESPACE
+namespace Ui {
+class Widget;
+}
+QT_END_NAMESPACE
+
+class Widget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    Widget(QWidget *parent = nullptr);
+    ~Widget();
+
+private:
+    QAntPrimaryButton* priBtn;
+
+private:
+    Ui::Widget *ui;
+};
+#endif // WIDGET_H

+ 19 - 0
widget.ui

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Widget</class>
+ <widget class="QWidget" name="Widget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Widget</string>
+  </property>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>