From 9bed3ed536b134453ce5abaed5d64a3ef83b6028 Mon Sep 17 00:00:00 2001 From: taynpg Date: Wed, 5 Nov 2025 10:57:40 +0800 Subject: [PATCH] =?UTF-8?q?fun=EF=BC=9A=E6=B7=BB=E5=8A=A0Loading=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 6 +- ClientCore/ClientCore.cpp | 8 ++ ClientCore/ClientCore.h | 2 + ClientCore/FileTrans.cpp | 1 - Gui/CMakeLists.txt | 9 ++- Gui/Control/CompareControl.cpp | 8 ++ Gui/Form/Loading.cpp | 139 +++++++++++++++++++++++++++++++++ Gui/Form/Loading.h | 45 +++++++++++ Note/version.md | 2 +- Protocol/Protocol.h | 9 ++- Res/frelay.qrc | 1 + Res/loading.gif | Bin 0 -> 7657 bytes Struct/InfoMsg.h | 17 +++- 13 files changed, 236 insertions(+), 11 deletions(-) create mode 100644 Gui/Form/Loading.cpp create mode 100644 Gui/Form/Loading.h create mode 100644 Res/loading.gif diff --git a/.vscode/settings.json b/.vscode/settings.json index e700a27..eaca38c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -143,7 +143,11 @@ "fstream": "cpp", "xmemory0": "cpp", "xstddef": "cpp", - "xtree": "cpp" + "xtree": "cpp", + "qxmlstreamwriter": "cpp", + "qgraphicsdropshadoweffect": "cpp", + "qpushbutton": "cpp", + "qpainter": "cpp" }, "editor.tokenColorCustomizations": { "textMateRules": [ diff --git a/ClientCore/ClientCore.cpp b/ClientCore/ClientCore.cpp index 40bc81a..fdf166e 100644 --- a/ClientCore/ClientCore.cpp +++ b/ClientCore/ClientCore.cpp @@ -181,6 +181,14 @@ void ClientCore::UseFrame(QSharedPointer frame) emit sigOffline(frame); break; } + case FBT_MSGINFO_ASK: { + emit sigMsgAsk(frame); + break; + } + case FBT_MSGINFO_ANSWER: { + emit sigMsgAnswer(frame); + break; + } default: qCritical() << QString("未知的帧类型: %1").arg(frame->type); break; diff --git a/ClientCore/ClientCore.h b/ClientCore/ClientCore.h index 07052fd..bb700b6 100644 --- a/ClientCore/ClientCore.h +++ b/ClientCore/ClientCore.h @@ -78,6 +78,8 @@ signals: void sigFileInfo(QSharedPointer frame); void sigOffline(QSharedPointer frame); void sigYourId(QSharedPointer frame); + void sigMsgAsk(QSharedPointer frame); + void sigMsgAnswer(QSharedPointer frame); signals: void conSuccess(); diff --git a/ClientCore/FileTrans.cpp b/ClientCore/FileTrans.cpp index d217fd5..0bba515 100644 --- a/ClientCore/FileTrans.cpp +++ b/ClientCore/FileTrans.cpp @@ -333,7 +333,6 @@ void FileTrans::SendFile(const QSharedPointer& task) auto* sendThread = new SendThread(clientCore_); sendThread->setTask(task); QMutexLocker locker(&sthMut_); - // TODO: check if already exist upTasks_[task->task.localId] = sendThread; sendThread->run(); } diff --git a/Gui/CMakeLists.txt b/Gui/CMakeLists.txt index d4d316b..2e6bec9 100644 --- a/Gui/CMakeLists.txt +++ b/Gui/CMakeLists.txt @@ -10,8 +10,8 @@ set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_definitions(-DUSE_QT_GUI) -find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Network) -find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Network) +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Network Concurrent) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Network Concurrent) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) set(PROJECT_SOURCES main.cpp @@ -26,7 +26,7 @@ Form/Transform.h Form/Transform.cpp Form/Transform.ui Control/cusTableWidget.cpp Control/cusTableWidget.h Control/cpTableWidget.h Control/cpTableWidget.cpp GuiUtil/Config.h GuiUtil/Config.cpp -../Res/qss.qrc +../Res/qss.qrc Form/Loading.h Form/Loading.cpp ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) @@ -55,8 +55,9 @@ endif() target_link_libraries(frelayGUI PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Concurrent ClientCore Protocol - Util + Util Struct SingleApplication::SingleApplication ) diff --git a/Gui/Control/CompareControl.cpp b/Gui/Control/CompareControl.cpp index d175b89..da57725 100644 --- a/Gui/Control/CompareControl.cpp +++ b/Gui/Control/CompareControl.cpp @@ -6,6 +6,7 @@ #include #include +#include "Form/Loading.h" #include "GuiUtil/Public.h" #include "ui_CompareControl.h" @@ -80,6 +81,13 @@ void Compare::InitControl() connect(ui->btnLoad, &QPushButton::clicked, this, &Compare::Load); connect(ui->btnLeft, &QPushButton::clicked, this, &Compare::TransToLeft); connect(ui->btnRight, &QPushButton::clicked, this, &Compare::TransToRight); + + // 测试代码 + connect(ui->btnReplace, &QPushButton::clicked, this, [this]() { + // auto* loading = new LoadingDialog(this); + // loading->exec(); + }); + LoadTitles(); } diff --git a/Gui/Form/Loading.cpp b/Gui/Form/Loading.cpp new file mode 100644 index 0000000..ce6be89 --- /dev/null +++ b/Gui/Form/Loading.cpp @@ -0,0 +1,139 @@ +#include "Loading.h" + +LoadingDialog::LoadingDialog(QWidget* parent) : QDialog(parent) +{ + // 如果需要显示任务栏对话框则删除Qt::Tool + setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); + setAttribute(Qt::WA_TranslucentBackground, true); + initUi(); +} + +/** + * @brief LoadingDialog::initUi UI元素初始化 + */ +void LoadingDialog::initUi() +{ + this->setFixedSize(250, 250); + m_pCenterFrame = new QFrame(this); + m_pCenterFrame->setGeometry(10, 10, 230, 230); + + // 加载Loading动画 + m_pLoadingMovie = new QMovie(":/ico/loading.gif"); + m_pLoadingMovie->setScaledSize(QSize(120, 120)); + m_pMovieLabel = new QLabel(m_pCenterFrame); + m_pMovieLabel->setGeometry(55, 10, 120, 120); + m_pMovieLabel->setScaledContents(true); + m_pMovieLabel->setMovie(m_pLoadingMovie); + m_pLoadingMovie->start(); + + // 提示文本 + m_pTipsLabel = new QLabel(m_pCenterFrame); + m_pTipsLabel->setGeometry(5, 130, 220, 50); + m_pTipsLabel->setAlignment(Qt::AlignCenter | Qt::AlignHCenter); + m_pTipsLabel->setObjectName("tips"); + m_pTipsLabel->setText("加载中,请稍候..."); + m_pTipsLabel->setStyleSheet("QLabel#tips{font-family:\"Microsoft YaHei\";font-size: 15px;color: #333333;}"); + + // 取消按钮 + m_pCancelBtn = new QPushButton(m_pCenterFrame); + m_pCancelBtn->setObjectName("cancelBtn"); + m_pCancelBtn->setText("取消等待"); + m_pCancelBtn->setStyleSheet("QPushButton#cancelBtn{" + "background-color: #edeef6;" + "border-radius: 4px;" + "font-family: \"Microsoft YaHei\";" + "font-size: 14px;" + "color: #333333;" + "}" + "QPushButton#cancelBtn::hover{" + "background:#dcdeea" + "}"); + m_pCancelBtn->setGeometry(25, 180, 180, 35); + m_pCancelBtn->setEnabled(true); + connect(m_pCancelBtn, &QPushButton::clicked, this, &LoadingDialog::cancelBtnClicked); + + // 实例阴影shadow + QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect(this); + shadow->setOffset(0, 0); + shadow->setColor(QColor(32, 101, 165)); + shadow->setBlurRadius(10); + this->setGraphicsEffect(shadow); +} + +/** + * @brief LoadingDialog::setTipsText 设置提示文本 + * @param strTipsText 提示文本 + */ +void LoadingDialog::setTipsText(QString strTipsText) +{ + m_pTipsLabel->setText(strTipsText); +} + +/** + * @brief LoadingDialog::setCanCancel 设置是够允许用户点击取消等待按钮 + * @param bCanCancel 是够允许 + */ +void LoadingDialog::setCanCancel(bool bCanCancel) +{ + m_pCancelBtn->setEnabled(bCanCancel); +} + +/** + * @brief LoadingDialog::moveToCenter 移动对话框到指定窗口中间 + * @param pParent 指定窗口指针 + */ +void LoadingDialog::moveToCenter(QWidget* pParent) +{ + if (pParent != nullptr && pParent != NULL) { + int nParentWidth = pParent->width(); + int nParentHeigth = pParent->height(); + + int nWidth = this->width(); + int nHeight = this->height(); + + int nParentX = pParent->x(); + int nParentY = pParent->y(); + + int x = (nParentX + (nParentWidth - nWidth) / 2); + int y = (nParentY + (nParentHeigth - nHeight) / 2); + + this->move(x, y); + } +} + +/** + * @brief LoadingDialog::cancelBtnClicked 取消按钮槽函数 + */ +void LoadingDialog::cancelBtnClicked() +{ + emit cancelWaiting(); + this->done(USER_CANCEL); +} + +/** + * @brief LoadingDialog::paintEvent 界面绘制 + * @param event + */ +void LoadingDialog::paintEvent(QPaintEvent* event) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); // 反锯齿 + painter.setBrush(QBrush(Qt::white)); + painter.setPen(Qt::transparent); + QRect rect = this->rect(); + rect.setLeft(9); + rect.setTop(9); + rect.setWidth(rect.width() - 9); + rect.setHeight(rect.height() - 9); + painter.drawRoundedRect(rect, 8, 8); + QWidget::paintEvent(event); +} + +LoadingDialog::~LoadingDialog() +{ + delete m_pLoadingMovie; + delete m_pMovieLabel; + delete m_pTipsLabel; + delete m_pCancelBtn; + delete m_pCenterFrame; +} diff --git a/Gui/Form/Loading.h b/Gui/Form/Loading.h new file mode 100644 index 0000000..9af0c81 --- /dev/null +++ b/Gui/Form/Loading.h @@ -0,0 +1,45 @@ +#ifndef LOADINGDIALOG_H +#define LOADINGDIALOG_H + +#include +#include +#include +#include +#include +#include +#define USER_CANCEL -1 + +// LoadingDialog 改造来源:https://blog.csdn.net/weixin_42105886/article/details/114665272 +class LoadingDialog : public QDialog +{ + Q_OBJECT +public: + explicit LoadingDialog(QWidget* parent = nullptr); + ~LoadingDialog(); + // 设置提示文本 + void setTipsText(QString strTipsText); + // 设置是否显示取消等待按钮 + void setCanCancel(bool bCanCancel); + // 移动到指定窗口中间显示 + void moveToCenter(QWidget* pParent); + +protected: + void paintEvent(QPaintEvent* event) override; + +private: + void initUi(); + +Q_SIGNALS: + void cancelWaiting(); + +private slots: + void cancelBtnClicked(); + +private: + QFrame* m_pCenterFrame; + QLabel* m_pMovieLabel; + QMovie* m_pLoadingMovie; + QLabel* m_pTipsLabel; + QPushButton* m_pCancelBtn; +}; +#endif // LOADINGDIALOG_H \ No newline at end of file diff --git a/Note/version.md b/Note/version.md index 86ae040..4a57532 100644 --- a/Note/version.md +++ b/Note/version.md @@ -16,7 +16,7 @@ | 23 | 问题 | 作为接收端如果对方断联要处理这个情况。 | | 0.2.2 | | | 22 | 功能 | 配置可以切组。 | | 0.2.2 | | | 21 | 功能 | 可以传输文件夹。 | | 0.2.2 | | -| 20 | 功能 | 对照传输可以打开本地文件夹。 | | 0.2.2 | | +| 20 | 功能 | 对照传输可以打开本地文件夹。 | | 0.2.2 | 0.2.3 | | 19 | 问题 | 客户之间心跳包,被动/主动失联后断开,清除相关内容,终止相关任务。 | | 0.2.2 | 0.2.3 | | 18 | 问题 | 断开后重连貌似没有发送心跳包。 | | 0.1 | 0.2 | | 17 | 问题 | 服务端主动踢出的客户端,主动重连假链接,不可用无反应。 | | 0.1 | 0.2 | diff --git a/Protocol/Protocol.h b/Protocol/Protocol.h index d52d8f5..cc03af2 100644 --- a/Protocol/Protocol.h +++ b/Protocol/Protocol.h @@ -36,9 +36,16 @@ enum FrameBufferType : uint16_t { FBT_CLI_FILE_BUFFER, FBT_CLI_TRANS_DONE, FBT_CLI_TRANS_FAILED, - FBT_CLI_FILE_INFO + FBT_CLI_FILE_INFO, + FBT_MSGINFO_ASK, + FBT_MSGINFO_ANSWER }; +// 字符串标识 +#define STRMSG_CHECK_FILE_EXIST "checkFileExist" +#define STRMSG_FILE_EXIST "fileExist" +#define STRMSG_FILE_NOT_EXIST "fileNotExist" + struct FrameBuffer { QByteArray data; QString fid; diff --git a/Res/frelay.qrc b/Res/frelay.qrc index 727aff0..3e706d6 100644 --- a/Res/frelay.qrc +++ b/Res/frelay.qrc @@ -2,5 +2,6 @@ main.ico server.ico + loading.gif diff --git a/Res/loading.gif b/Res/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b343823ec0fac62c357b8cde6c31339713d81688 GIT binary patch literal 7657 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 F{XcwiImG|~ literal 0 HcmV?d00001 diff --git a/Struct/InfoMsg.h b/Struct/InfoMsg.h index 90f094f..d530eca 100644 --- a/Struct/InfoMsg.h +++ b/Struct/InfoMsg.h @@ -9,23 +9,34 @@ struct InfoMsg { qint32 mark{}; + QString command; QString msg; QString fromPath; QString toPath; quint64 size{}; quint32 permissions{}; + QVector list; void serialize(QDataStream& data) const { - data << mark << msg << fromPath << toPath << size << permissions; + data << mark << command << msg << fromPath << toPath << size << permissions; + data << list.size(); + for (const auto& item : list) { + data << item; + } } void deserialize(QDataStream& data) { - data >> mark >> msg >> fromPath >> toPath >> size >> permissions; + data >> mark >> command >> msg >> fromPath >> toPath >> size >> permissions; + qint32 listSize; + data >> listSize; + list.resize(listSize); + for (auto& item : list) { + data >> item; + } } }; - QDataStream& operator<<(QDataStream& data, const InfoMsg& info); QDataStream& operator>>(QDataStream& data, InfoMsg& info);