QT中使用QNetworkAccessManager类进行POST数据
QNetworkAccessManager类简介:
1
QNetworkAccessManager类允许应用程序发送网络请求和接收网络应答。
Network Access API都是围绕着一个QNetworkAccessManager对象构造的,这个对象包含着发送请求的一些通用配置和设置。它包含着代理和缓存的配置,以及和这些事物相关的一些信号,并且应答信号可以作为我们检测一个网络操作的进度。
一个QNetworkAccessManager对于一整个Qt应用程序来说已经足够了!
一旦一个QNetworkAccessManager对象被创建了,那么应用程序就可以使用它在网络上发送请求。它提供了一组标准的函数,可以承载网络请求和一些可选的数据,并且每一个请求返回一个QNetworkReply对象。该返回的对象包含着返回的请求应带的所有数据。
本例使用POST向网站页面传递数据,HTTP传输数据主要有两种形式,分别是Get和POST,两者的详细的介绍请参见[这里](http://blog.csdn.net/yipiankongbai/article/details/24025633)。 本例运行的最终效果图如下
详情 查阅 https://blog.csdn.net/A_a_ron/article/details/47283019
QT中使用QNetworkAccessManager类进行POST数据QNetworkAccessManager类简介:1QNetworkAccessManager类允许应用程序发送网络请求和接收网络应答。Network Access API都是围绕着一个QNetworkAccessManager对象构造的,这个对象包含着发送请求的一些通用配置和设置。它包含着代理和缓存的配置,以及和这些事物相关的一些信号,并且应答信号可以作为我们检测一个网络操作的进度。一个QNetworkAccessManager对于一整个Qt应用程序来说已经足够了!一旦一个QNetworkAccessManager对象被创建了,那么应用程序就可以使用它在网络上发送请求。它提供了一组标准的函数,可以承载网络请求和一些可选的数据,并且每一个请求返回一个QNetworkReply对象。该返回的对象包含着返回的请求应带的所有数据。
本例使用POST向网站页面传递数据,HTTP传输数据主要有两种形式,分别是Get和POST,两者的详细的介绍请参见[这里](http://blog.csdn.net/yipiankongbai/article/details/24025633)。 本例运行的最终效果图如下12
实现的功能是:
点击POST按钮,发送一个数据,并把这个数据写入数据库,网页上显示的是当前数据库中的数据条数。显示数据采用AJAX,可以在固定的时间间隔内自动刷新获得数据(通过不断的向服务器发送GET请求实现。这样写对服务器的压力比较大,我这里主要是为了演示POST的使用方法,实际中不采用这种不断GET的方法)。1QT的代码如下:
//QT的工程文件#-------------------------------------------------## Project created by QtCreator 2015-08-04T14:40:58##-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = networkTestTEMPLATE = app
SOURCES += main.cpp\ mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.uiQT+=network1234567891011121314151617181920212223//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H
#include <QMainWindow>#include <QNetworkReply>#include <QNetworkRequest>#include<windows.h>namespace Ui {class MainWindow;}
class MainWindow : public QMainWindow{ Q_OBJECT
public: explicit MainWindow(QWidget *parent = 0); ~MainWindow();public slots: void finishedSlot(QNetworkReply *reply); void onClicked(); void onClickedPost();private: Ui::MainWindow *ui; QNetworkAccessManager *nam;//定义变量};
#endif // MAINWINDOW_H123456789101112131415161718192021222324252627282930//main.c#include "mainwindow.h"#include <QApplication>
int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; w.show();
return a.exec();}12345678910111213//mainwindow.cpp#include "mainwindow.h"#include "ui_mainwindow.h"#include<QHttp>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); nam=new QNetworkAccessManager(this); connect(ui->pushButton_get,SIGNAL(clicked()),this,SLOT(onClicked())); connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(finishedSlot(QNetworkReply*))); connect(ui->pushButton_post,SIGNAL(clicked()),this,SLOT(onClickedPost()));}
MainWindow::~MainWindow(){ delete ui;}
void MainWindow::finishedSlot(QNetworkReply *reply){#if 1 // Reading attributes of the reply // e.g. the HTTP status code QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); // Or the target URL if it was a redirect: QVariant redirectionTargetUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); // see CS001432 on how to handle this
// no error received? if (reply->error() == QNetworkReply::NoError) { QByteArray bytes = reply->readAll(); // bytes //QString string(bytes); // string QString string = QString::fromUtf8(bytes);
ui->textBrowser->setText(string); } else { // handle errors here }
// We receive ownership of the reply object // and therefore need to handle deletion. reply->deleteLater();#endif}
void MainWindow::onClicked(){ QUrl url("http://www.hust.edu.cn/"); nam->get(QNetworkRequest(url));}
void MainWindow::onClickedPost(){ //QUrl url("http://www.hust.edu.cn/"); //QUrl url("http://www.google.com/ig/api?weather=wuhan");// QHttp re;// QHttpRequestHeader request_header; QNetworkRequest request; QUrl url("http://localhost/CI/index.php/welcome/getdata");
QByteArray data; data.append("name=admin&"); data.append("email=weihao");
// request.setHeader(QNetworkRequest::ContentLengthHeader, data.length());
request.setUrl(url); request.setRawHeader("Content-Type","application/x-www-form-urlencoded");// QByteArray append("name=admin&email=123456"); //QNetworkReply* reply = nam->get(QNetworkRequest(url)); QNetworkReply* reply = nam->post(request, data);
// NOTE: Store QNetworkReply pointer (maybe into caller). // When this HTTP request is finished you will receive this same // QNetworkReply as response parameter. // By the QNetworkReply pointer you can identify request and response.
}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788//mainwindow.ui<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralWidget"> <widget class="QWidget" name="layoutWidget"> <property name="geometry"> <rect> <x>30</x> <y>10</y> <width>341</width> <height>194</height> </rect> </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QTextBrowser" name="textBrowser"/> </item> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="pushButton_get"> <property name="text"> <string>get</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_post"> <property name="text"> <string>post</string> </property> </widget> </item> </layout> </item> </layout> </widget> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>20</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/></ui>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576以上是QT客户端代码。服务器端我使用的CI的框架,如果不清楚这个的话直接百度,上面有详细的讲解。不过本例的实现与这个CI框架无关,只是个人使用习惯。(代码是按照CI框架的结构来写的)
其他的文件与本例无关,可以直接忽略。主要是画红线的文件。
//welconme.php<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller { public function index() { $this->load->view('myform'); } public function getdata() { $temp=new common_m('content','data'); $data['content'] =$_POST['name']; // $this->load->view('formsuccess'); $this->getContent(); $temp->insert($data);
} public function getnum() {//这里是使用数据库的语句,具体的用法可以CI的modles文件夹中找 //到这个common_m.php的文件,里面有详细的用法。 $temp=new common_m('content','data'); echo $temp->_all_num(); } public function getContent() { $this->load->view('formsuccess'); }}
/* End of file welcome.php *//* Location: ./application/controllers/welcome.php */123456789101112131415161718192021222324252627282930视图中的文件
//myform.php<html><head><title>My Form</title></head><body><form action="welcome/getdata" method="post">Name: <input type="text" name="name"><br>E-mail: <input type="text" name="email"><br><input type="submit"></form></body></html>12345678910111213//formsuccess.php<html><head><title>My Form</title><script type="text/javascript">function loadXMLDoc(){var xmlhttp;if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); }else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } //写出完整路径,获取要显示的数据xmlhttp.open("GET","http://localhost/CI/index.php/welcome/getnum",true);xmlhttp.send();//每隔1秒中更新一下数据setTimeout("loadXMLDoc()", 1000);}</script></head><body><p>The Number:</p><div id="myDiv"><h2>Let AJAX change this text</h2></div><!-- <button type="button" onclick="loadXMLDoc()">通过 AJAX 改变内容</button> -->
<script type="text/javascript">loadXMLDoc();</script></body></html>
12345678910111213141516171819202122232425262728293031323334353637383940以上就是这个例子的介绍。有不足的地方,欢迎大家进行指正(∩_∩)。附上代码包下载链接http://download.csdn.net/detail/a_a_ron/8960635————————————————版权声明:本文为CSDN博主「Atomwh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/A_a_ron/article/details/47283019