diff --git a/QelButton/QelButton.pri b/QelButton/QelButton.pri index 9a23e3e..08289b4 100644 --- a/QelButton/QelButton.pri +++ b/QelButton/QelButton.pri @@ -1,5 +1,8 @@ SOURCES += \ - $$PWD/QelButton.cpp + $$PWD/QelButton.cpp \ + $$PWD/QelButtonGroup.cpp HEADERS += \ - $$PWD/QelButton.h + $$PWD/QelButton.h \ + $$PWD/QelButtonGroup.h \ + $$PWD/QelButtonTester.h diff --git a/QelButton/QelButton.pro b/QelButton/QelButton.pro index fa2f215..321736c 100644 --- a/QelButton/QelButton.pro +++ b/QelButton/QelButton.pro @@ -4,35 +4,46 @@ # #------------------------------------------------- -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += core gui widgets TARGET = QelButton TEMPLATE = app -# The following define makes your compiler emit warnings if you use -# any feature of Qt which has been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +CONFIG += c++11 +CONFIG += debug_and_release +DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ - main.cpp \ - QelButton.cpp + main.cpp \ + QelButton.cpp \ + QelButtonGroup.cpp HEADERS += \ - QelButton.h \ - QelButtonTester.h - -DISTFILES += \ - QelButton.pri - - -include($$PWD/../QelIcon/QelIcon.pri)) + QelButton.h \ + QelButtonGroup.h \ + QelButtonTester.h + +# 包含 QelIcon +include($$PWD/../QelIcon/QelIcon.pri) + +INCLUDEPATH += $$PWD/.. +DEPENDPATH += $$PWD/.. + +# 设置输出目录 +CONFIG(debug, debug|release) { + DESTDIR = $$OUT_PWD/../debug + OBJECTS_DIR = debug + MOC_DIR = debug + RCC_DIR = debug + UI_DIR = debug +} else { + DESTDIR = $$OUT_PWD/../release + OBJECTS_DIR = release + MOC_DIR = release + RCC_DIR = release + UI_DIR = release +} + +# 确保输出目录存在 +mkpath($$DESTDIR) diff --git a/QelButton/QelButtonGroup.cpp b/QelButton/QelButtonGroup.cpp new file mode 100644 index 0000000..cc0bba5 --- /dev/null +++ b/QelButton/QelButtonGroup.cpp @@ -0,0 +1,139 @@ +#include "QelButtonGroup.h" +#include +#include + +namespace qel { + +QelButtonGroup::QelButtonGroup(QWidget *parent) + : QWidget(parent) + , m_size(QelButton::Medium) + , m_type(QelButton::Default) +{ + initUI(); + updateStyle(); +} + +void QelButtonGroup::initUI() +{ + m_layout = new QHBoxLayout(this); + m_layout->setSpacing(0); + m_layout->setContentsMargins(0, 0, 0, 0); + setLayout(m_layout); +} + +void QelButtonGroup::addButton(QelButton* button) +{ + if (!button) return; + + m_buttons.append(button); + m_layout->addWidget(button); + + // 更新按钮样式 + button->setSize(m_size); + button->setType(m_type); + + // 特殊处理第一个和最后一个按钮的圆角 + updateStyle(); +} + +void QelButtonGroup::setSize(QelButton::ButtonSize size) +{ + m_size = size; + for (QelButton* btn : m_buttons) { + btn->setSize(size); + } +} + +void QelButtonGroup::setType(QelButton::ButtonType type) +{ + m_type = type; + for (QelButton* btn : m_buttons) { + btn->setType(type); + } +} + +void QelButtonGroup::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); +} + +void QelButtonGroup::updateStyle() +{ + if (m_buttons.isEmpty()) return; + + QString baseStyle = R"( + QelButtonGroup { + border: none; + background: transparent; + } + )"; + + // 设置按钮组的样式 + for (int i = 0; i < m_buttons.size(); ++i) { + QelButton* btn = m_buttons[i]; + QString btnStyle; + + if (i == 0) { + // 第一个按钮:左边有圆角,右边没有 + btnStyle = QString(R"( + QPushButton { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: none; + margin: 0; + } + QPushButton:hover { + position: relative; + z-index: 1; + border-right: 1px solid %1; + } + )").arg(btn->property("type") == QelButton::Primary ? "#66b1ff" : "#c0c4cc"); + } else if (i == m_buttons.size() - 1) { + // 最后一个按钮:右边有圆角,左边没有 + btnStyle = QString(R"( + QPushButton { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 0; + margin-left: -1px; + } + QPushButton:hover { + position: relative; + z-index: 1; + } + )"); + } else { + // 中间的按钮:两边都没有圆角 + btnStyle = QString(R"( + QPushButton { + border-radius: 0; + border-right: none; + margin: 0; + margin-left: -1px; + } + QPushButton:hover { + position: relative; + z-index: 1; + border-right: 1px solid %1; + } + )").arg(btn->property("type") == QelButton::Primary ? "#66b1ff" : "#c0c4cc"); + } + + // 合并现有样式和新样式 + QString currentStyle = btn->styleSheet(); + if (!currentStyle.isEmpty()) { + currentStyle += "\n"; + } + btn->setStyleSheet(currentStyle + btnStyle); + } + + setStyleSheet(baseStyle); + + // 更新布局 + m_layout->setSpacing(0); + m_layout->setContentsMargins(0, 0, 0, 0); +} + +} // namespace qel diff --git a/QelButton/QelButtonGroup.h b/QelButton/QelButtonGroup.h new file mode 100644 index 0000000..2029edb --- /dev/null +++ b/QelButton/QelButtonGroup.h @@ -0,0 +1,41 @@ +#ifndef QELBUTTONGROUP_H +#define QELBUTTONGROUP_H + +#include +#include +#include "QelButton.h" + +namespace qel { + +class QelButtonGroup : public QWidget +{ + Q_OBJECT + +public: + explicit QelButtonGroup(QWidget *parent = nullptr); + + // 添加按钮到组 + void addButton(QelButton* button); + + // 设置按钮组大小 + void setSize(QelButton::ButtonSize size); + + // 设置按钮组类型 + void setType(QelButton::ButtonType type); + +protected: + void paintEvent(QPaintEvent *event) override; + +private: + void initUI(); + void updateStyle(); + + QHBoxLayout* m_layout; + QList m_buttons; + QelButton::ButtonSize m_size; + QelButton::ButtonType m_type; +}; + +} // namespace qel + +#endif // QELBUTTONGROUP_H diff --git a/QelButton/QelButtonTester.h b/QelButton/QelButtonTester.h index daadeb5..2462bd8 100644 --- a/QelButton/QelButtonTester.h +++ b/QelButton/QelButtonTester.h @@ -2,6 +2,7 @@ #define QELBUTTONTESTER_H #include "QelButton.h" +#include "QelButtonGroup.h" #include #include @@ -13,12 +14,11 @@ using namespace qel; class QelButtonTester : public QWidget { + Q_OBJECT public: - explicit QelButtonTester(QWidget *parent = nullptr) : QWidget(parent) + explicit QelButtonTester(QWidget *parent = nullptr) : QWidget(parent), mainLayout(new QVBoxLayout(this)) { - QVBoxLayout *mainLayout = new QVBoxLayout(this); - - // Default buttons + // Default buttons QList defaultButtons; defaultButtons.append(new QelButton(QelButton::Default, QelButton::Medium, false, false, false, false, QelButton::Button, QIcon(), "Default", this)); defaultButtons.append(new QelButton(QelButton::Primary, QelButton::Medium, false, false, false, false, QelButton::Button, QIcon(), "Primary", this)); @@ -28,7 +28,7 @@ class QelButtonTester : public QWidget { defaultButtons.append(new QelButton(QelButton::Danger, QelButton::Medium, false, false, false, false, QelButton::Button, QIcon(), "Danger", this)); addButtonRow(mainLayout, "Default Buttons", defaultButtons); - // Plain buttons + // Plain buttons QList plainButtons; plainButtons.append(new QelButton(QelButton::Default, QelButton::Medium, true, false, false, false, QelButton::Button, QIcon(), "Plain", this)); plainButtons.append(new QelButton(QelButton::Primary, QelButton::Medium, true, false, false, false, QelButton::Button, QIcon(), "Primary", this)); @@ -38,7 +38,7 @@ class QelButtonTester : public QWidget { plainButtons.append(new QelButton(QelButton::Danger, QelButton::Medium, true, false, false, false, QelButton::Button, QIcon(), "Danger", this)); addButtonRow(mainLayout, "Plain Buttons", plainButtons); - // Round buttons + // Round buttons QList roundButtons; roundButtons.append(new QelButton(QelButton::Primary, QelButton::Medium, false, true, false, false, QelButton::Button, QIcon(), "Primary", this)); roundButtons.append(new QelButton(QelButton::Success, QelButton::Medium, false, true, false, false, QelButton::Button, QIcon(), "Success", this)); @@ -47,7 +47,7 @@ class QelButtonTester : public QWidget { roundButtons.append(new QelButton(QelButton::Danger, QelButton::Medium, false, true, false, false, QelButton::Button, QIcon(), "Danger", this)); addButtonRow(mainLayout, "Round Buttons", roundButtons); - // Icon buttons + // Icon buttons QList iconButtons; iconButtons.append(new QelButton(QelButton::Default, QelButton::Small, false, true, true, false, QelButton::Button, QelIcon(QelIcon::Search, 16, Qt::gray), "", this)); iconButtons.append(new QelButton(QelButton::Primary, QelButton::Small, false, true, true, false, QelButton::Button, QelIcon(QelIcon::Edit, 16, Qt::white), "", this)); @@ -66,7 +66,7 @@ class QelButtonTester : public QWidget { disabledButtons.append(new QelButton(QelButton::Warning, QelButton::Medium, false, false, false, false, QelButton::Button, QIcon(), "Warning", this)); disabledButtons.append(new QelButton(QelButton::Danger, QelButton::Medium, false, false, false, false, QelButton::Button, QIcon(), "Danger", this)); - // 设置所有按钮为禁用状态 + // 设置所有按钮为禁用状态 for (QelButton *button : disabledButtons) { button->setDisabled(true); } @@ -86,10 +86,13 @@ class QelButtonTester : public QWidget { button->setDisabled(true); } addButtonRow(mainLayout, "Disabled Plain Buttons", disabledPlainButtons); - setLayout(mainLayout); + + setupButtonGroups(); } private: + QVBoxLayout *mainLayout; + void addButtonRow(QVBoxLayout *layout, const QString &title, const QList &buttons) { QHBoxLayout *rowLayout = new QHBoxLayout(); @@ -103,6 +106,34 @@ class QelButtonTester : public QWidget { layout->addLayout(rowLayout); } + + void setupButtonGroups() + { + QLabel* groupLabel = new QLabel("Button Groups", this); + mainLayout->addWidget(groupLabel); + + // 创建基础按钮组 + QelButtonGroup* basicGroup = new QelButtonGroup(this); + QelButton* prevBtn = new QelButton(QelButton::Primary, QelButton::Medium, false, false, false, false, + QelButton::Button, QelIcon(QelIcon::ArrowLeft, 16, Qt::white), + "Previous Page", this); + QelButton* nextBtn = new QelButton(QelButton::Primary, QelButton::Medium, false, false, false, false, + QelButton::Button, QelIcon(QelIcon::ArrowRight, 16, Qt::white), + "Next Page", this); + basicGroup->addButton(prevBtn); + basicGroup->addButton(nextBtn); + mainLayout->addWidget(basicGroup); + + // 创建图标按钮组 + QelButtonGroup* iconGroup = new QelButtonGroup(this); + QList icons = {QelIcon::Edit, QelIcon::Share, QelIcon::Trash}; + for (auto icon : icons) { + QelButton* btn = new QelButton(QelButton::Primary, QelButton::Medium, false, false, false, false, + QelButton::Button, QelIcon(icon, 16, Qt::white), "", this); + iconGroup->addButton(btn); + } + mainLayout->addWidget(iconGroup); + } }; #endif // QELBUTTONTESTER_H diff --git a/QelButton/main.cpp b/QelButton/main.cpp index a200f35..543b263 100644 --- a/QelButton/main.cpp +++ b/QelButton/main.cpp @@ -5,9 +5,15 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); + // 创建主窗口 QMainWindow mainWindow; - QelButtonTester *tester = new QelButtonTester(); + mainWindow.setWindowTitle("QelButton Demo"); + + // 创建测试器实例 + QelButtonTester *tester = new QelButtonTester(&mainWindow); mainWindow.setCentralWidget(tester); + + // 设置合适的窗口大小 mainWindow.resize(800, 600); mainWindow.show(); diff --git a/QelIcon/QelIcon.pri b/QelIcon/QelIcon.pri index 5f00e06..5a40726 100644 --- a/QelIcon/QelIcon.pri +++ b/QelIcon/QelIcon.pri @@ -1,6 +1,22 @@ HEADERS += \ - $$PWD/QelIcon.h \ - $$PWD/QelIconTester.h + $$PWD/QelIcon.h RESOURCES += \ - resources.qrc + $$PWD/resources.qrc + +# 添加字体文件到资源系统 +RESOURCES += \ + $$PWD/fonts.qrc + +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD + +# 确保目标目录存在 +mkpath($$OUT_PWD/fonts) + +# 复制字体文件 +win32 { + QMAKE_POST_LINK += $$QMAKE_COPY $$shell_quote($$PWD/fonts/fontawesome-4.7.0.ttf) $$shell_quote($$OUT_PWD/fonts) $$escape_expand(\\n\\t) +} else { + QMAKE_POST_LINK += $$QMAKE_COPY $$shell_quote($$PWD/fonts/fontawesome-4.7.0.ttf) $$shell_quote($$OUT_PWD/fonts) $$escape_expand(\n\t) +} diff --git a/QelIcon/fonts.qrc b/QelIcon/fonts.qrc new file mode 100644 index 0000000..15cf7b1 --- /dev/null +++ b/QelIcon/fonts.qrc @@ -0,0 +1,6 @@ + + + + fonts/fontawesome-4.7.0.ttf + + diff --git a/QtElementUI.pro b/QtElementUI.pro index 56e9cea..bf42835 100644 --- a/QtElementUI.pro +++ b/QtElementUI.pro @@ -1,8 +1,17 @@ TEMPLATE = subdirs +CONFIG += ordered + SUBDIRS += \ QelIcon \ - QelButton \ + QelButton \ QelNumberInput \ QelShow +# 设置依赖关系 +QelButton.depends = QelIcon +QelShow.depends = QelIcon QelButton QelNumberInput + +# 添加构建配置 +CONFIG += debug_and_release +CONFIG += c++11