Skip to content

Commit 7fe4639

Browse files
committed
[更新项目依赖和代码结构]: 更新项目以使用 Qt 6.5 并优化代码结构
- 将所有项目中的 Qt6::Widgets 替换为 Qt::Widgets,以适应 Qt 6.5 的命名规范 - 将所有项目中的 Qt6::Quick 替换为 Qt::Quick - 在 HttpClient 项目中添加对 Qt::Test 的依赖,以支持单元测试 - 优化了多个项目的 CMakeLists.txt 文件,简化了源文件的设置方式 - 更新了 HttpClient 项目的代码,增加了上传和下载文件的功能,并添加了单元测试
1 parent 4165ea6 commit 7fe4639

File tree

37 files changed

+396
-227
lines changed

37 files changed

+396
-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

+83-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>
@@ -168,7 +169,7 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
168169
const QByteArray fromRange = "bytes=" + QByteArray::number(bytes) + "-";
169170
request.setRawHeader("Range", fromRange);
170171
}
171-
qDebug() << QString("Download: %-1>%2").arg(url.toString(QUrl::RemoveUserInfo), filePath);
172+
qDebug() << QString("Download: %1->%2").arg(url.toString(QUrl::RemoveUserInfo), filePath);
172173

173174
auto *reply = QNetworkAccessManager::get(request);
174175
d_ptr->downloads
@@ -187,16 +188,17 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
187188
return reply;
188189
}
189190

190-
QNetworkReply *HttpClient::upload(const QUrl &url,
191-
const QString &filePath,
192-
int timeout,
193-
bool verifyCertificate,
194-
CallBack callBack)
191+
QNetworkReply *HttpClient::upload_put(const QUrl &url,
192+
const QString &filePath,
193+
int timeout,
194+
bool verifyCertificate,
195+
CallBack callBack)
195196
{
196197
Q_ASSERT(!filePath.isEmpty());
197198
auto *file = new QFile(filePath, this);
198199
if (!file->open(QIODevice::ReadOnly)) {
199200
qWarning() << QString("Cannot open the file: %1!").arg(filePath) << file->errorString();
201+
file->deleteLater();
200202
return nullptr;
201203
}
202204
qDebug() << QString("Upload: %1->%2").arg(filePath, url.toString(QUrl::RemoveUserInfo));
@@ -206,35 +208,78 @@ QNetworkReply *HttpClient::upload(const QUrl &url,
206208
auto *reply = QNetworkAccessManager::put(request, file);
207209
file->setParent(reply);
208210
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-
}
211+
connectUploadSlots(reply, timeout, callBack);
218212
return reply;
219213
}
220214

221-
QNetworkReply *HttpClient::upload(
215+
QNetworkReply *HttpClient::upload_put(
222216
const QUrl &url, const QByteArray &data, int timeout, bool verifyCertificate, CallBack callBack)
223217
{
224218
qDebug() << QString("Upload To %1").arg(url.toString(QUrl::RemoveUserInfo));
225219

226220
auto request = d_ptr->networkRequest(verifyCertificate);
227221
request.setUrl(url);
228222
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);
223+
connectUploadSlots(reply, timeout, callBack);
224+
return reply;
225+
}
226+
227+
QNetworkReply *HttpClient::upload_post(const QUrl &url,
228+
const QString &filePath,
229+
int timeout,
230+
bool verifyCertificate,
231+
CallBack callBack)
232+
{
233+
Q_ASSERT(!filePath.isEmpty());
234+
auto *file = new QFile(filePath, this);
235+
if (!file->open(QIODevice::ReadOnly)) {
236+
qWarning() << QString("Cannot open the file: %1!").arg(filePath) << file->errorString();
237+
file->deleteLater();
238+
return nullptr;
237239
}
240+
auto filename = QFileInfo(filePath).fileName();
241+
qDebug() << QString("Upload: %1->%2")
242+
.arg(filePath, url.toString(QUrl::RemoveUserInfo) + "/" + filename);
243+
244+
auto disposition = QString("form-data; name=\"%1\"; filename=\"%2\"").arg("file", filename);
245+
QHttpPart filePart;
246+
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(disposition));
247+
filePart.setBodyDevice(file);
248+
auto *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
249+
multiPart->append(filePart);
250+
251+
auto request = d_ptr->networkRequest(verifyCertificate);
252+
request.setUrl(url);
253+
254+
auto *reply = QNetworkAccessManager::post(request, multiPart);
255+
file->setParent(reply);
256+
multiPart->setParent(reply);
257+
d_ptr->uploads.insert(reply, file);
258+
connectUploadSlots(reply, timeout, callBack);
259+
return reply;
260+
}
261+
262+
QNetworkReply *HttpClient::upload_post(const QUrl &url,
263+
const QString &filename,
264+
const QByteArray &data,
265+
int timeout,
266+
bool verifyCertificate,
267+
CallBack callBack)
268+
{
269+
qDebug() << QString("Upload To %1").arg(url.toString(QUrl::RemoveUserInfo) + "/" + filename);
270+
auto disposition = QString("form-data; name=\"%1\"; filename=\"%2\"").arg("file", filename);
271+
QHttpPart filePart;
272+
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(disposition));
273+
filePart.setBody(data);
274+
auto *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
275+
multiPart->append(filePart);
276+
277+
auto request = d_ptr->networkRequest(verifyCertificate);
278+
request.setUrl(url);
279+
280+
auto *reply = QNetworkAccessManager::post(request, multiPart);
281+
multiPart->setParent(reply);
282+
connectUploadSlots(reply, timeout, callBack);
238283
return reply;
239284
}
240285

@@ -368,6 +413,19 @@ QJsonObject HttpClient::hookResult(const QJsonObject &object)
368413
return object;
369414
}
370415

416+
void HttpClient::connectUploadSlots(QNetworkReply *reply, int timeout, CallBack callBack)
417+
{
418+
d_ptr->tasks.insert(reply, callBack);
419+
connect(reply, &QNetworkReply::errorOccurred, this, &HttpClient::onErrorOccurred);
420+
connect(reply, &QNetworkReply::sslErrors, this, &HttpClient::onSslErrors);
421+
connect(reply, &QNetworkReply::finished, this, &HttpClient::onUploadFinish);
422+
if (timeout > 0) {
423+
auto *timer = new QTimer(reply);
424+
connect(timer, &QTimer::timeout, this, &HttpClient::onNetworkTimeout);
425+
timer->start(timeout * 1000);
426+
}
427+
}
428+
371429
void HttpClient::queryResult(QNetworkReply *reply, const QJsonObject &object)
372430
{
373431
qDebug() << object;

HttpClient/httpclient.hpp

+22-10
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,27 @@ class HttpClient : public QNetworkAccessManager
3434
ProgressCallBack progressCallBack = nullptr,
3535
CallBack callBack = nullptr);
3636

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

4859
signals:
4960
void timeOut();
@@ -63,6 +74,7 @@ private slots:
6374
virtual QJsonObject hookResult(const QJsonObject &object);
6475

6576
private:
77+
void connectUploadSlots(QNetworkReply *reply, int timeout, CallBack callBack);
6678
void queryResult(QNetworkReply *reply, const QJsonObject &object);
6779

6880
class HttpClientPrivate;

0 commit comments

Comments
 (0)