2014/6/4
总体思路:利用qtnetwork中的函数实现post登陆,然后下载话费详单到本地,再进行分析
遇到的问题
1、移动登陆时需要输入验证码
暂时的思路:将验证码下载到本地然后再打开显示在界面上
//代码段1:将验证码文件读取并显示
QString filename = "D:/test.jpg";
if(filename.isEmpty())
{
return;
}
else
{
QImage* img=new QImage;
if(! ( img->load(filename) ) ) //加载图像
{
QMessageBox::information(this,
tr("打开图像失败"),
tr("打开图像失败!"));
delete img;
return;
}
ui->label1->setPixmap(QPixmap::fromImage(*img));
}
接下来考虑如何下载图片
想法是用QNetworkAccessManager读取之后直接用QFile保存即可,不过用QFile之后会出现乱码
参考了http://www.oschina.net/code/snippet_583625_19562博文之后知道了应该用qpixmap来保存图片文件
移动验证码地址:https://sn.ac.10086.cn/servlet/CreateImage?num 其中num可取1-11(应该还有别的值,不过好像随便取哪个值都能实现获得验证码)
知道这些之后就能编写下载图片函数了,结合代码段1就能实现读取并显示验证码了,完整代码如下:
void MainWindow::loadimage(QNetworkReply* reply)
{
//下面三行实现下载验证码
currentPicture = new QPixmap;
currentPicture->loadFromData(reply->readAll());
currentPicture->save(PICPATH);//PICPATH为宏定义的保存路径
//读取验证码文件并显示
QString filename = PICPATH;
if(filename.isEmpty())
{
return;
}
else
{
QImage* img=new QImage;
if(! ( img->load(filename) ) ) //加载图像
{
QMessageBox::information(this,
tr("打开图像失败"),
tr("打开图像失败!"));
delete img;
return;
}
//label的text设置为loading
ui->label->setPixmap(QPixmap::fromImage(*img));
}
}
//构造类中创建了QNetworkAccessManager实例,并关联信号槽
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
picmanager = new QNetworkAccessManager(this);//下载图片的manager
connect(picmanager,SIGNAL(finished(QNetworkReply*)),//下载验证码
this,SLOT(loadimage(QNetworkReply*)));
//访问移动验证码地址
picmanager->get(QNetworkRequest(QUrl("https://sn.ac.10086.cn/servlet/CreateImage?2")));
}
//mainwindow.h
#include <QMainWindow>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QString>
#include <QMessageBox>
#include <QFile>
#include <QDebug>
#include <QPixmap>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QFile *file;
QPixmap *currentPicture;
private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;
QNetworkAccessManager *picmanager;
private slots:
void replyFinished(QNetworkReply *);
void loadimage(QNetworkReply* );
};
#endif // MAINWINDOW_H
至此,验证码问题完美解决,下一步准备用post实现登陆