Skip to content

Commit 2a468d2

Browse files
committed
[代码重构与优化]: 对项目代码进行大规模重构与优化,提升可维护性和一致性
- 将 `Qt6::` 模块链接改为 `Qt::`,以适配新版本的 Qt 模块命名规范 - 优化 CMakeLists.txt 文件,简化源文件列表定义,提升可读性 - 在 HttpClient 模块中添加新的上传和下载功能,支持 PUT 和 POST 方法 - 为 HttpClient 添加单元测试,覆盖 GET、PUT、POST 和 DELETE 请求 - 修复 HttpClient 中文件上传和下载的路径处理问题 - 更新 README.md 文件,补充 HttpClient 功能描述
1 parent e653561 commit 2a468d2

File tree

37 files changed

+450
-227
lines changed

37 files changed

+450
-227
lines changed

Battery/CMakeLists.txt

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
set(PROJECT_SOURCES
2-
main.cpp
3-
mainwindow.cpp
4-
mainwindow.h
5-
batterywidget.h
6-
batterywidget.cpp)
1+
set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h batterywidget.h
2+
batterywidget.cpp)
73

84
qt_add_executable(Battery MANUAL_FINALIZATION ${PROJECT_SOURCES})
9-
target_link_libraries(Battery PRIVATE Qt6::Widgets)
5+
target_link_libraries(Battery PRIVATE Qt::Widgets)
106
qt_finalize_executable(Battery)

BatteryQuick/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ set_target_properties(
2222
MACOSX_BUNDLE TRUE
2323
WIN32_EXECUTABLE TRUE)
2424

25-
target_link_libraries(BatteryQuick PRIVATE Qt6::Quick)
25+
target_link_libraries(BatteryQuick PRIVATE Qt::Quick)
2626

2727
include(GNUInstallDirs)
2828
install(

Bootstrap/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ endif()
1111
qt_add_resources(SOURCES resouce.qrc)
1212

1313
qt_add_executable(Bootstrap MANUAL_FINALIZATION ${PROJECT_SOURCES} ${SOURCES})
14-
target_link_libraries(Bootstrap PRIVATE Qt6::Widgets)
14+
target_link_libraries(Bootstrap PRIVATE Qt::Widgets)
1515
qt_finalize_executable(Bootstrap)

BubbleWindow/CMakeLists.txt

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
set(PROJECT_SOURCES
2-
main.cpp
3-
mainwindow.cpp
4-
mainwindow.h
5-
bubblewidget.h
6-
bubblewidget.cpp)
1+
set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h bubblewidget.h
2+
bubblewidget.cpp)
73

84
qt_add_executable(BubbleWindow MANUAL_FINALIZATION ${PROJECT_SOURCES})
9-
target_link_libraries(BubbleWindow PRIVATE Qt6::Widgets)
5+
target_link_libraries(BubbleWindow PRIVATE Qt::Widgets)
106
qt_finalize_executable(BubbleWindow)

CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ find_package(
1919
Network
2020
Concurrent
2121
Sql
22-
Quick)
22+
Quick
23+
Test)
2324

2425
qt_standard_project_setup(REQUIRES 6.5)
2526
qt_policy(SET QTP0001 NEW)

Chart/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@ set(PROJECT_SOURCES
2626
stackedbarchart.cpp)
2727

2828
qt_add_executable(Chart MANUAL_FINALIZATION ${PROJECT_SOURCES})
29-
target_link_libraries(Chart PRIVATE Qt6::Widgets Qt6::Charts)
29+
target_link_libraries(Chart PRIVATE Qt::Widgets Qt::Charts)
3030
qt_finalize_executable(Chart)

CheckBoxStandardItem/CMakeLists.txt

+4-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
set(PROJECT_SOURCES
2-
main.cc
3-
mainwindow.cc
4-
mainwindow.hpp
5-
checkboxstandarditem.hpp
6-
checkboxstandarditem.cc)
1+
set(PROJECT_SOURCES main.cc mainwindow.cc mainwindow.hpp
2+
checkboxstandarditem.hpp checkboxstandarditem.cc)
73

84
qt_add_executable(CheckBoxStandardItem MANUAL_FINALIZATION ${PROJECT_SOURCES})
9-
target_link_libraries(CheckBoxStandardItem PRIVATE Qt6::Widgets)
10-
qt_finalize_executable(CheckBoxStandardItem)
5+
target_link_libraries(CheckBoxStandardItem PRIVATE Qt::Widgets)
6+
qt_finalize_executable(CheckBoxStandardItem)

Clock/CMakeLists.txt

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
set(PROJECT_SOURCES
2-
main.cpp
3-
mainwindow.cpp
4-
mainwindow.h
5-
clockwidget.h
6-
clockwidget.cpp)
1+
set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h clockwidget.h
2+
clockwidget.cpp)
73

84
qt_add_executable(Clock MANUAL_FINALIZATION ${PROJECT_SOURCES})
9-
target_link_libraries(Clock PRIVATE Qt6::Widgets)
5+
target_link_libraries(Clock PRIVATE Qt::Widgets)
106
qt_finalize_executable(Clock)

DashBoard/CMakeLists.txt

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
set(PROJECT_SOURCES
2-
main.cpp
3-
mainwindow.cpp
4-
mainwindow.h
5-
dashboardwidget.h
6-
dashboardwidget.cpp)
1+
set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h dashboardwidget.h
2+
dashboardwidget.cpp)
73

84
qt_add_executable(DashBoard MANUAL_FINALIZATION ${PROJECT_SOURCES})
9-
target_link_libraries(DashBoard PRIVATE Qt6::Widgets)
5+
target_link_libraries(DashBoard PRIVATE Qt::Widgets)
106
qt_finalize_executable(DashBoard)

DragDrop/CMakeLists.txt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
set(PROJECT_SOURCES
2-
main.cpp
3-
mainwindow.cpp
4-
mainwindow.h
5-
draglistwidget.h
6-
draglistwidget.cpp
7-
droplistwidget.h
8-
droplistwidget.cpp)
2+
main.cpp
3+
mainwindow.cpp
4+
mainwindow.h
5+
draglistwidget.h
6+
draglistwidget.cpp
7+
droplistwidget.h
8+
droplistwidget.cpp)
99

1010
qt_add_executable(DragDrop MANUAL_FINALIZATION ${PROJECT_SOURCES})
11-
target_link_libraries(DragDrop PRIVATE Qt6::Widgets)
11+
target_link_libraries(DragDrop PRIVATE Qt::Widgets)
1212
qt_finalize_executable(DragDrop)

FlowLayout/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ set(PROJECT_SOURCES
88
flowwidget.cc)
99

1010
qt_add_executable(FlowLayout MANUAL_FINALIZATION ${PROJECT_SOURCES})
11-
target_link_libraries(FlowLayout PRIVATE Qt6::Widgets)
11+
target_link_libraries(FlowLayout PRIVATE Qt::Widgets)
1212
qt_finalize_executable(FlowLayout)

GridViewModel/CMakeLists.txt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
set(PROJECT_SOURCES
2-
main.cpp
3-
mainwindow.cpp
4-
mainwindow.h
5-
gridmodel.h
6-
gridmodel.cpp
7-
gridview.h
8-
gridview.cpp)
2+
main.cpp
3+
mainwindow.cpp
4+
mainwindow.h
5+
gridmodel.h
6+
gridmodel.cpp
7+
gridview.h
8+
gridview.cpp)
99

1010
qt_add_executable(GridViewModel MANUAL_FINALIZATION ${PROJECT_SOURCES})
11-
target_link_libraries(GridViewModel PRIVATE Qt6::Widgets)
11+
target_link_libraries(GridViewModel PRIVATE Qt::Widgets)
1212
qt_finalize_executable(GridViewModel)

HttpClient/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set(PROJECT_SOURCES main.cpp httpclient.cc httpclient.hpp)
22

33
qt_add_executable(HttpClient MANUAL_FINALIZATION ${PROJECT_SOURCES})
4-
target_link_libraries(HttpClient PRIVATE Qt6::Network Qt6::Concurrent)
4+
target_link_libraries(HttpClient PRIVATE Qt::Network Qt::Concurrent Qt::Test)
55
qt_finalize_executable(HttpClient)

HttpClient/HttpClient.pro

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
QT += core gui network
1+
QT += core gui network testlib
22

33
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
44

HttpClient/httpclient.cc

+90-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#include "httpclient.hpp"
22

33
#include <QEventLoop>
4-
#include <QFile>
4+
#include <QFileInfo>
5+
#include <QHttpMultiPart>
56
#include <QJsonDocument>
67
#include <QJsonObject>
78
#include <QPointer>
@@ -147,6 +148,13 @@ QJsonObject HttpClient::sync(QNetworkReply *reply)
147148
return json;
148149
}
149150

151+
void HttpClient::cancel(QNetworkReply *reply)
152+
{
153+
d_ptr->clearTask(reply);
154+
reply->abort();
155+
reply->deleteLater();
156+
}
157+
150158
QNetworkReply *HttpClient::downLoad(const QUrl &url,
151159
const QString &filePath,
152160
int timeout,
@@ -168,7 +176,7 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
168176
const QByteArray fromRange = "bytes=" + QByteArray::number(bytes) + "-";
169177
request.setRawHeader("Range", fromRange);
170178
}
171-
qDebug() << QString("Download: %-1>%2").arg(url.toString(QUrl::RemoveUserInfo), filePath);
179+
qDebug() << QString("Download: %1->%2").arg(url.toString(QUrl::RemoveUserInfo), filePath);
172180

173181
auto *reply = QNetworkAccessManager::get(request);
174182
d_ptr->downloads
@@ -187,16 +195,17 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
187195
return reply;
188196
}
189197

190-
QNetworkReply *HttpClient::upload(const QUrl &url,
191-
const QString &filePath,
192-
int timeout,
193-
bool verifyCertificate,
194-
CallBack callBack)
198+
QNetworkReply *HttpClient::upload_put(const QUrl &url,
199+
const QString &filePath,
200+
int timeout,
201+
bool verifyCertificate,
202+
CallBack callBack)
195203
{
196204
Q_ASSERT(!filePath.isEmpty());
197205
auto *file = new QFile(filePath, this);
198206
if (!file->open(QIODevice::ReadOnly)) {
199207
qWarning() << QString("Cannot open the file: %1!").arg(filePath) << file->errorString();
208+
file->deleteLater();
200209
return nullptr;
201210
}
202211
qDebug() << QString("Upload: %1->%2").arg(filePath, url.toString(QUrl::RemoveUserInfo));
@@ -206,35 +215,78 @@ QNetworkReply *HttpClient::upload(const QUrl &url,
206215
auto *reply = QNetworkAccessManager::put(request, file);
207216
file->setParent(reply);
208217
d_ptr->uploads.insert(reply, file);
209-
d_ptr->tasks.insert(reply, callBack);
210-
connect(reply, &QNetworkReply::errorOccurred, this, &HttpClient::onErrorOccurred);
211-
connect(reply, &QNetworkReply::sslErrors, this, &HttpClient::onSslErrors);
212-
connect(reply, &QNetworkReply::finished, this, &HttpClient::onUploadFinish);
213-
if (timeout > 0) {
214-
auto *timer = new QTimer(reply);
215-
connect(timer, &QTimer::timeout, this, &HttpClient::onNetworkTimeout);
216-
timer->start(timeout * 1000);
217-
}
218+
connectUploadSlots(reply, timeout, callBack);
218219
return reply;
219220
}
220221

221-
QNetworkReply *HttpClient::upload(
222+
QNetworkReply *HttpClient::upload_put(
222223
const QUrl &url, const QByteArray &data, int timeout, bool verifyCertificate, CallBack callBack)
223224
{
224225
qDebug() << QString("Upload To %1").arg(url.toString(QUrl::RemoveUserInfo));
225226

226227
auto request = d_ptr->networkRequest(verifyCertificate);
227228
request.setUrl(url);
228229
auto *reply = QNetworkAccessManager::put(request, data);
229-
d_ptr->tasks.insert(reply, callBack);
230-
connect(reply, &QNetworkReply::errorOccurred, this, &HttpClient::onErrorOccurred);
231-
connect(reply, &QNetworkReply::sslErrors, this, &HttpClient::onSslErrors);
232-
connect(reply, &QNetworkReply::finished, this, &HttpClient::onUploadFinish);
233-
if (timeout > 0) {
234-
auto *timer = new QTimer(reply);
235-
connect(timer, &QTimer::timeout, this, &HttpClient::onNetworkTimeout);
236-
timer->start(timeout * 1000);
230+
connectUploadSlots(reply, timeout, callBack);
231+
return reply;
232+
}
233+
234+
QNetworkReply *HttpClient::upload_post(const QUrl &url,
235+
const QString &filePath,
236+
int timeout,
237+
bool verifyCertificate,
238+
CallBack callBack)
239+
{
240+
Q_ASSERT(!filePath.isEmpty());
241+
auto *file = new QFile(filePath, this);
242+
if (!file->open(QIODevice::ReadOnly)) {
243+
qWarning() << QString("Cannot open the file: %1!").arg(filePath) << file->errorString();
244+
file->deleteLater();
245+
return nullptr;
237246
}
247+
auto filename = QFileInfo(filePath).fileName();
248+
qDebug() << QString("Upload: %1->%2")
249+
.arg(filePath, url.toString(QUrl::RemoveUserInfo) + "/" + filename);
250+
251+
auto disposition = QString("form-data; name=\"%1\"; filename=\"%2\"").arg("file", filename);
252+
QHttpPart filePart;
253+
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(disposition));
254+
filePart.setBodyDevice(file);
255+
auto *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
256+
multiPart->append(filePart);
257+
258+
auto request = d_ptr->networkRequest(verifyCertificate);
259+
request.setUrl(url);
260+
261+
auto *reply = QNetworkAccessManager::post(request, multiPart);
262+
file->setParent(reply);
263+
multiPart->setParent(reply);
264+
d_ptr->uploads.insert(reply, file);
265+
connectUploadSlots(reply, timeout, callBack);
266+
return reply;
267+
}
268+
269+
QNetworkReply *HttpClient::upload_post(const QUrl &url,
270+
const QString &filename,
271+
const QByteArray &data,
272+
int timeout,
273+
bool verifyCertificate,
274+
CallBack callBack)
275+
{
276+
qDebug() << QString("Upload To %1").arg(url.toString(QUrl::RemoveUserInfo) + "/" + filename);
277+
auto disposition = QString("form-data; name=\"%1\"; filename=\"%2\"").arg("file", filename);
278+
QHttpPart filePart;
279+
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(disposition));
280+
filePart.setBody(data);
281+
auto *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
282+
multiPart->append(filePart);
283+
284+
auto request = d_ptr->networkRequest(verifyCertificate);
285+
request.setUrl(url);
286+
287+
auto *reply = QNetworkAccessManager::post(request, multiPart);
288+
multiPart->setParent(reply);
289+
connectUploadSlots(reply, timeout, callBack);
238290
return reply;
239291
}
240292

@@ -368,6 +420,19 @@ QJsonObject HttpClient::hookResult(const QJsonObject &object)
368420
return object;
369421
}
370422

423+
void HttpClient::connectUploadSlots(QNetworkReply *reply, int timeout, CallBack callBack)
424+
{
425+
d_ptr->tasks.insert(reply, callBack);
426+
connect(reply, &QNetworkReply::errorOccurred, this, &HttpClient::onErrorOccurred);
427+
connect(reply, &QNetworkReply::sslErrors, this, &HttpClient::onSslErrors);
428+
connect(reply, &QNetworkReply::finished, this, &HttpClient::onUploadFinish);
429+
if (timeout > 0) {
430+
auto *timer = new QTimer(reply);
431+
connect(timer, &QTimer::timeout, this, &HttpClient::onNetworkTimeout);
432+
timer->start(timeout * 1000);
433+
}
434+
}
435+
371436
void HttpClient::queryResult(QNetworkReply *reply, const QJsonObject &object)
372437
{
373438
qDebug() << object;

HttpClient/httpclient.hpp

+23-10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class HttpClient : public QNetworkAccessManager
2626
CallBack callBack = nullptr);
2727

2828
QJsonObject sync(QNetworkReply *reply);
29+
void cancel(QNetworkReply *reply);
2930

3031
QNetworkReply *downLoad(const QUrl &url,
3132
const QString &filePath,
@@ -34,16 +35,27 @@ class HttpClient : public QNetworkAccessManager
3435
ProgressCallBack progressCallBack = nullptr,
3536
CallBack callBack = nullptr);
3637

37-
QNetworkReply *upload(const QUrl &url,
38-
const QString &filePath,
39-
int timeout = -1,
40-
bool verifyCertificate = true,
41-
CallBack callBack = nullptr);
42-
QNetworkReply *upload(const QUrl &url,
43-
const QByteArray &data,
44-
int timeout = -1,
45-
bool verifyCertificate = true,
46-
CallBack callBack = nullptr);
38+
QNetworkReply *upload_put(const QUrl &url,
39+
const QString &filePath,
40+
int timeout = -1,
41+
bool verifyCertificate = true,
42+
CallBack callBack = nullptr);
43+
QNetworkReply *upload_put(const QUrl &url,
44+
const QByteArray &data,
45+
int timeout = -1,
46+
bool verifyCertificate = true,
47+
CallBack callBack = nullptr);
48+
QNetworkReply *upload_post(const QUrl &url,
49+
const QString &filePath,
50+
int timeout = -1,
51+
bool verifyCertificate = true,
52+
CallBack callBack = nullptr);
53+
QNetworkReply *upload_post(const QUrl &url,
54+
const QString &filename,
55+
const QByteArray &data,
56+
int timeout = -1,
57+
bool verifyCertificate = true,
58+
CallBack callBack = nullptr);
4759

4860
signals:
4961
void timeOut();
@@ -63,6 +75,7 @@ private slots:
6375
virtual QJsonObject hookResult(const QJsonObject &object);
6476

6577
private:
78+
void connectUploadSlots(QNetworkReply *reply, int timeout, CallBack callBack);
6679
void queryResult(QNetworkReply *reply, const QJsonObject &object);
6780

6881
class HttpClientPrivate;

0 commit comments

Comments
 (0)