fun:添加Loading窗口。
This commit is contained in:
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -143,7 +143,11 @@
|
|||||||
"fstream": "cpp",
|
"fstream": "cpp",
|
||||||
"xmemory0": "cpp",
|
"xmemory0": "cpp",
|
||||||
"xstddef": "cpp",
|
"xstddef": "cpp",
|
||||||
"xtree": "cpp"
|
"xtree": "cpp",
|
||||||
|
"qxmlstreamwriter": "cpp",
|
||||||
|
"qgraphicsdropshadoweffect": "cpp",
|
||||||
|
"qpushbutton": "cpp",
|
||||||
|
"qpainter": "cpp"
|
||||||
},
|
},
|
||||||
"editor.tokenColorCustomizations": {
|
"editor.tokenColorCustomizations": {
|
||||||
"textMateRules": [
|
"textMateRules": [
|
||||||
|
|||||||
@@ -181,6 +181,14 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
|
|||||||
emit sigOffline(frame);
|
emit sigOffline(frame);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FBT_MSGINFO_ASK: {
|
||||||
|
emit sigMsgAsk(frame);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FBT_MSGINFO_ANSWER: {
|
||||||
|
emit sigMsgAnswer(frame);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
qCritical() << QString("未知的帧类型: %1").arg(frame->type);
|
qCritical() << QString("未知的帧类型: %1").arg(frame->type);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ signals:
|
|||||||
void sigFileInfo(QSharedPointer<FrameBuffer> frame);
|
void sigFileInfo(QSharedPointer<FrameBuffer> frame);
|
||||||
void sigOffline(QSharedPointer<FrameBuffer> frame);
|
void sigOffline(QSharedPointer<FrameBuffer> frame);
|
||||||
void sigYourId(QSharedPointer<FrameBuffer> frame);
|
void sigYourId(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void sigMsgAsk(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void sigMsgAnswer(QSharedPointer<FrameBuffer> frame);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void conSuccess();
|
void conSuccess();
|
||||||
|
|||||||
@@ -333,7 +333,6 @@ void FileTrans::SendFile(const QSharedPointer<DoTransTask>& task)
|
|||||||
auto* sendThread = new SendThread(clientCore_);
|
auto* sendThread = new SendThread(clientCore_);
|
||||||
sendThread->setTask(task);
|
sendThread->setTask(task);
|
||||||
QMutexLocker locker(&sthMut_);
|
QMutexLocker locker(&sthMut_);
|
||||||
// TODO: check if already exist
|
|
||||||
upTasks_[task->task.localId] = sendThread;
|
upTasks_[task->task.localId] = sendThread;
|
||||||
sendThread->run();
|
sendThread->run();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ set(CMAKE_CXX_STANDARD 11)
|
|||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
add_definitions(-DUSE_QT_GUI)
|
add_definitions(-DUSE_QT_GUI)
|
||||||
find_package(QT NAMES Qt6 Qt5 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)
|
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Network Concurrent)
|
||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
set(PROJECT_SOURCES main.cpp
|
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/cusTableWidget.cpp Control/cusTableWidget.h
|
||||||
Control/cpTableWidget.h Control/cpTableWidget.cpp
|
Control/cpTableWidget.h Control/cpTableWidget.cpp
|
||||||
GuiUtil/Config.h GuiUtil/Config.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)
|
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
|
||||||
@@ -55,8 +55,9 @@ endif()
|
|||||||
target_link_libraries(frelayGUI PRIVATE
|
target_link_libraries(frelayGUI PRIVATE
|
||||||
Qt${QT_VERSION_MAJOR}::Widgets
|
Qt${QT_VERSION_MAJOR}::Widgets
|
||||||
Qt${QT_VERSION_MAJOR}::Network
|
Qt${QT_VERSION_MAJOR}::Network
|
||||||
|
Qt${QT_VERSION_MAJOR}::Concurrent
|
||||||
ClientCore Protocol
|
ClientCore Protocol
|
||||||
Util
|
Util
|
||||||
Struct SingleApplication::SingleApplication
|
Struct SingleApplication::SingleApplication
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <QXmlStreamReader>
|
#include <QXmlStreamReader>
|
||||||
#include <QXmlStreamWriter>
|
#include <QXmlStreamWriter>
|
||||||
|
|
||||||
|
#include "Form/Loading.h"
|
||||||
#include "GuiUtil/Public.h"
|
#include "GuiUtil/Public.h"
|
||||||
#include "ui_CompareControl.h"
|
#include "ui_CompareControl.h"
|
||||||
|
|
||||||
@@ -80,6 +81,13 @@ void Compare::InitControl()
|
|||||||
connect(ui->btnLoad, &QPushButton::clicked, this, &Compare::Load);
|
connect(ui->btnLoad, &QPushButton::clicked, this, &Compare::Load);
|
||||||
connect(ui->btnLeft, &QPushButton::clicked, this, &Compare::TransToLeft);
|
connect(ui->btnLeft, &QPushButton::clicked, this, &Compare::TransToLeft);
|
||||||
connect(ui->btnRight, &QPushButton::clicked, this, &Compare::TransToRight);
|
connect(ui->btnRight, &QPushButton::clicked, this, &Compare::TransToRight);
|
||||||
|
|
||||||
|
// 测试代码
|
||||||
|
connect(ui->btnReplace, &QPushButton::clicked, this, [this]() {
|
||||||
|
// auto* loading = new LoadingDialog(this);
|
||||||
|
// loading->exec();
|
||||||
|
});
|
||||||
|
|
||||||
LoadTitles();
|
LoadTitles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
139
Gui/Form/Loading.cpp
Normal file
139
Gui/Form/Loading.cpp
Normal file
@@ -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;
|
||||||
|
}
|
||||||
45
Gui/Form/Loading.h
Normal file
45
Gui/Form/Loading.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#ifndef LOADINGDIALOG_H
|
||||||
|
#define LOADINGDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QGraphicsDropShadowEffect>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QMovie>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QPushButton>
|
||||||
|
#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
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
| 23 | 问题 | 作为接收端如果对方断联要处理这个情况。 | | 0.2.2 | |
|
| 23 | 问题 | 作为接收端如果对方断联要处理这个情况。 | | 0.2.2 | |
|
||||||
| 22 | 功能 | 配置可以切组。 | | 0.2.2 | |
|
| 22 | 功能 | 配置可以切组。 | | 0.2.2 | |
|
||||||
| 21 | 功能 | 可以传输文件夹。 | | 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 |
|
| 19 | 问题 | 客户之间心跳包,被动/主动失联后断开,清除相关内容,终止相关任务。 | | 0.2.2 | 0.2.3 |
|
||||||
| 18 | 问题 | 断开后重连貌似没有发送心跳包。 | | 0.1 | 0.2 |
|
| 18 | 问题 | 断开后重连貌似没有发送心跳包。 | | 0.1 | 0.2 |
|
||||||
| 17 | 问题 | 服务端主动踢出的客户端,主动重连假链接,不可用无反应。 | | 0.1 | 0.2 |
|
| 17 | 问题 | 服务端主动踢出的客户端,主动重连假链接,不可用无反应。 | | 0.1 | 0.2 |
|
||||||
|
|||||||
@@ -36,9 +36,16 @@ enum FrameBufferType : uint16_t {
|
|||||||
FBT_CLI_FILE_BUFFER,
|
FBT_CLI_FILE_BUFFER,
|
||||||
FBT_CLI_TRANS_DONE,
|
FBT_CLI_TRANS_DONE,
|
||||||
FBT_CLI_TRANS_FAILED,
|
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 {
|
struct FrameBuffer {
|
||||||
QByteArray data;
|
QByteArray data;
|
||||||
QString fid;
|
QString fid;
|
||||||
|
|||||||
@@ -2,5 +2,6 @@
|
|||||||
<qresource prefix="/ico">
|
<qresource prefix="/ico">
|
||||||
<file>main.ico</file>
|
<file>main.ico</file>
|
||||||
<file>server.ico</file>
|
<file>server.ico</file>
|
||||||
|
<file>loading.gif</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
BIN
Res/loading.gif
Normal file
BIN
Res/loading.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
@@ -9,23 +9,34 @@
|
|||||||
|
|
||||||
struct InfoMsg {
|
struct InfoMsg {
|
||||||
qint32 mark{};
|
qint32 mark{};
|
||||||
|
QString command;
|
||||||
QString msg;
|
QString msg;
|
||||||
QString fromPath;
|
QString fromPath;
|
||||||
QString toPath;
|
QString toPath;
|
||||||
quint64 size{};
|
quint64 size{};
|
||||||
quint32 permissions{};
|
quint32 permissions{};
|
||||||
|
QVector<QString> list;
|
||||||
|
|
||||||
void serialize(QDataStream& data) const
|
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)
|
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, const InfoMsg& info);
|
||||||
QDataStream& operator>>(QDataStream& data, InfoMsg& info);
|
QDataStream& operator>>(QDataStream& data, InfoMsg& info);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user