基于qt5的移动话费详单读取分析程序开发记录


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实现登陆



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值