Qt:网络请求

QNetworkRequest:网络请求
QNetworkAccessManager:协调网络操作(发射信号/身份验证请求/代理)
QNetworkReply:请求应答

信号

请求完成触发信号:finished(QNetworkReply*)
进度:downloadProgress(qint64, qint64)
可读:readyRead()
发送请求:get/post

步骤

1. 创建一个请求
QNetworkRequest request;
request.setUrl(QUrl(url));
2. 创建一个管理器
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
3. 连接请求结束信号
connect(manager, SIGNAL(finished(QNetworkReply*)), [=](QNetworkReply *reply){
	if (reply->error() == QNetworkReply::NoError)
	{
	    QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
	    int code = variant.toInt(); // 状态码
	    // 数据处理
	    QByteArray bytes = reply->readAll();
	    QString str =QString::fromUtf8(bytes);
	}
	else
	{
	    qDebug() << reply->errorString() << " error " << reply->error();
	}
	if (reply->isRunning())
	{
	    reply->abort(); // 立即中止操作并关闭网络连接
	}
	reply->deleteLater(); // 并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象
	reply = NULL;
});
4. 发送GET请求
QNetworkReply *reply = manager->get(request);

同步实现网络请求

QEventLoop loop; // 使用事件循环使得网络通讯同步进行
QTimer timer;
timer.setSingleShot(true); // 只会触发一次
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
connect(manager, SIGNAL(finished(QNetworkReply *)), &loop, SLOT(quit()));
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
timer.start(4000);
loop.exec(); // 进入事件循环, 直到reply的finished()信号发出, 这个语句才能

if (timer.isActive()) // 定时器还在工作,即在规定时间内请求完成
{
    timer.stop();
    // 数据处理
}
if (reply->isRunning())
{
    reply->abort(); 
}
reply->deleteLater();
reply = NULL;

网络信息

// 主机名
Qstring localHostName = QHostInfo::localHostName();
QHostInfo info = QHostInfo::fromName(localHostName);

/**
 * @description: 获取ip地址
 * @param {type} 
 * @return: 
 */
QString getIP()
{
    QList<QHostAddress> list = QNetworkInterface::allAddresses(); // 网络接口列表
    foreach (QHostAddress address, list)
    {
        if (address.protocol() == QAbstractSocket::IPv4Protocol)
        { // 我们使用IPv4地址
            QString ip = address.toString();
            if (ip.contains("127.0") or ip.contains("::1"))
            {
                continue;
            }
            return address.toString();
        }
    }
    return "";
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值