今天看了一下Qt网络编程这一块的知识,写了一个登陆界面,通过网络请求PHP脚本,来实现登陆验证。
大体思路是这样的:点击登陆按钮时,将账号和密码发送到PHP脚本进行判断,然后接收返回来的值,进行判断。
1.新建QtGui应用,项目名称为postceshi,基类使用默认的QWidget即可,类名为Widget。
2.完成后打开postceshi.pro文件,然后添加下面一行代码来使用网络模块:
QT += network
3.下面打开widget.ui文件进入设计模式,向界面上加入两个标签、两个l单行文本框和一个按钮。效果如下图所示。
4.打开widget.h文件,先包含头文件:#include
然后添加private私有对象定义:
QNetworkReply *reply;
QString results;
QNetworkAccessManager *manager;
QNetworkRequest *request;
QByteArray *parmanager;
添加一个私有槽声明:
private slots:
void panduan(QNetworkReply*);//请求结果判断
void on_pushButton_clicked();//登陆按钮槽函数
void commper();//登陆判断槽函数
最后添加一个信号:
signals:
void lalala();//用于判断接收网络应答的结果判断,若不为空发送信号
5.下面到widget.cpp文件中,先在构造函数中添加如下代码:
manager = new QNetworkAccessManager; connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(panduan(QNetworkReply*)));
connect(this,SIGNAL(lalala()),this,SLOT(commper()));
这里先创建了一个QNetworkAccessManager类的实例,它用来发送网络请求和接收应答。然后关联了管理器的finished()信号和我们自定义的槽panduan(QNetworkReply*),每当网络应答结束时都会发射这个信号。最后使用了pos()函数来发送一个网络请求和数据,网络请求使用QNetworkRequest类表示。QT里的post()是这样的:
QNetworkReply *post(const QNetworkRequest &request, QIODevice *data);
QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data);
QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *multiPart);
6.下面添加槽的定义:
void Widget::panduan(QNetworkReply *reply)
{
results = "";
if(reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = reply->readAll();
results.prepend(bytes);//结果已经存到results中
if(results.length() != 0)
{
emit lalala();//如果results长度不为0,发送信号
}
}
}
void Widget::on_pushButton_clicked()
{
QString str = "zhanghao="+ui->lineEdit->text()+"&mima="+ui->lineEdit_2->text();
QString url = "http://localhost/PHPtext/welcome.php";
qDebug()<<ui->lineEdit->text()<<ui->lineEdit_2->text();//打印下账号和密码
parmanager = new QByteArray(str.toUtf8());
request = new QNetworkRequest(QUrl(url));
request->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));
reply = manager->post(*request,*parmanager);
}
void Widget::commper()
{
if(results == "OK")
QMessageBox::information(0,tr("提示"),tr("登陆成功!"));
else
{
QMessageBox::information(0,tr("提示"),tr("账号或者密码错误,请重新输入!"));
}
}
7.PHP脚本代码如下:
<?php
if($_POST["zhanghao"] == "123" && $_POST["mima"] == "456")
echo "OK";
else
echo "Error";
?>
对于Qt发过来的账号和密码进行判断,如果账号密码正确返回一个OK,负责返回一个Error.
8.效果如下所示。
这样就实现了登陆界面通过网络请求PHP脚本实现登陆。
另外,代码中的各种命名不是一个好的程序员所应该拥有的,望大家注意。