QT运行时的Debug、Release、Profile选项区别
QT安装勾选了MSVC编译器,但是MSVC编译器灰色解决办法
settings.json 中配置Qt Designer的搜索路径
c_cpp_properties.json 中配置 Qt 头文件路径
3D绘图:17个WebGL开源引擎框架
H5的3D游戏开源框架
清华最新开源 | 万能3D分割一切
QNetworkAccessManager 是Qt网络模块中的一个类,它用于管理网络请求和响应。它可以发送HTTP请求,处理HTTP响应,支持文件上传和下载,以及支持多种网络协议。
QNetworkAccessManager 使用异步方式发送请求和处理响应,这意味着它可以在不阻塞应用程序UI线程的情况下进行网络通信。当一个请求被发送时,QNetworkAccessManager将立即返回一个QNetworkReply对象,该对象可以用于监视请求的进度,访问响应数据以及处理响应错误。
QNetworkAccessManager 可以使用各种不同的请求类型,包括GET、POST、PUT、DELETE等。它还支持设置请求头、查询参数、表单数据等,以及可以设置代理服务器。
QT(17)- QNetworkAccessManager
QT基础(18)- QAbstractSocket
Qt实现HTTP客户端操作
Qt HTTP协议传输
利用QT通过http协议,来实现上传文件功能
void MainWindow::send()
{
QString url = "http://127.0.0.1:8000/upload";
QNetworkRequest request(url);
auto multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QString filePath = "D:/work/learnQt/test/MainWindow.h";
auto file = new QFile(filePath);
file->open(QIODevice::ReadOnly);
QHttpPart filePart;
filePart.setBodyDevice(file);
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QFileInfo(filePath).fileName()));
multiPart->append(filePart);
auto reply = m_pNetManager->post(request, multiPart);
connect(reply, &QNetworkReply::finished, this, [=]{
if (reply->error() == QNetworkReply::NoError) {
auto response = reply->readAll();
qDebug() << "send success, " << response;
} else {
auto err = reply->errorString();
qWarning() << "send failed, " << err;
}
reply->deleteLater();
multiPart->deleteLater();
file->deleteLater();
});
}
package main // 声明 main 包
import (
"fmt" // 导入 fmt 包,打印字符串是需要用到
"net/http"
)
func fileHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("method = ", r.Method) //请求方法
fmt.Println("URL = ", r.URL) // 浏览器发送请求文件路径
fmt.Println("header = ", r.Header) // 请求头
// fmt.Println("body = ", r.Body) // 请求包体
fmt.Println(r.RemoteAddr, "连接成功") //客户端网络地址
w.Write([]byte("hello http")) //给客户端回复数据
buf := make([]byte, 4096) // 定义切片缓冲区,存读到的内容
var result string
// 获取服务器发送的数据包内容
for {
n, err := r.Body.Read(buf) // 读body中的内容。
if n == 0 {
fmt.Println("Body.Read err:", err)
break
}
result += string(buf[:n]) // 累加读到的数据内容
}
// 打印从body中读到的所有内容
fmt.Println("result = ", result)
}
func main() { // 声明 main 主函数
fmt.Println("Hello World!") // 打印 Hello World!
http.HandleFunc("/upload", fileHandler)
http.ListenAndServe(":8000", nil)
}
服务端收到:
method = POST
URL = /upload
header = map[Accept-Encoding:[gzip, deflate] Accept-Language:[zh-CN,en,*] Connection:[Keep-Alive] Content-Length:[588] Content-Type:[multipart/form-data; boundary="boundary_.oOo._anqhudddTUkwnC3tyKjrcF0qSTtLmG5e"] Mime-Version:[1.0] User-Agent:[Mozilla/5.0]]
127.0.0.1:65179 连接成功
Body result = --boundary_.oOo._anqhudddTUkwnC3tyKjrcF0qSTtLmG5e
Content-Disposition: MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QNetworkAccessManager *m_pNetManager;
void send();
};
#endif // MAINWINDOW_H
--boundary_.oOo._anqhudddTUkwnC3tyKjrcF0qSTtLmG5e--