スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

QtとWebAPIを使って郵便番号から住所を取得する

郵便番号検索API を使った、郵便番号から住所を取得するサンプルをつくってみました。


まず、サンプルプログラムのフォームはこんな感じにします。
snapshot_050_120701_000252.png

上記フォームで、ラインエディットは、linePostalCode、lineAddress
ボタンはpushCodeToAddress
と名前を設定しています。

そして、上記フォームのソースコードは下記。

・ヘッダ
#ifndef POSTALCODETOADDRESS_H
#define POSTALCODETOADDRESS_H

#include <QtGui/QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>

#include "ui_PostalCodeToAddress.h"


class PostalCodeToAddress : public QMainWindow
{
    Q_OBJECT

public:
    PostalCodeToAddress(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~PostalCodeToAddress();

private:
    QString ParseAddresElem(const QString& src, const QString& elem_name) const;

private slots:
    void on_pushCodeToAddress_clicked();
    void replyFinished(QNetworkReply*);

private:
    Ui::PostalCodeToAddressClass ui;

    QNetworkAccessManager m_NetManager;
};

#endif // POSTALCODETOADDRESS_H


・ソース
#include "stdafx.h"
#include "PostalCodeToAddress.h"

#include <cassert>


PostalCodeToAddress::PostalCodeToAddress(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

    connect(&m_NetManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}

PostalCodeToAddress::~PostalCodeToAddress()
{
}

void PostalCodeToAddress::on_pushCodeToAddress_clicked()
{
    QString code = ui.linePostalCode->text();

    // 郵便番号が数字7個か調べる.
    if(!QRegExp(tr("[0-9]{7}")).exactMatch(code))
    {
        assert(false);
        return;
    }

    QString url = tr("http://zip.cgis.biz/xml/zip.php?zn=") + code;

    m_NetManager.get(QNetworkRequest(QUrl(url)));
}

// HTTPデータ受信完了時のイベント
void PostalCodeToAddress::replyFinished(QNetworkReply* reply)
{
    if(reply->error() != QNetworkReply::NoError)
    {
        QString err_msg = reply->errorString();
        assert(false);
        return;
    }

    QString str = QString::fromUtf8(reply->readAll().data());

    QString state   = ParseAddresElem(str, tr("state"));
    QString city    = ParseAddresElem(str, tr("city"));
    QString address = ParseAddresElem(str, tr("address"));
    QString company = ParseAddresElem(str, tr("company"));

    ui.lineAddress->setText(state + city + address + company);
}

// 住所の要素(都道府県, 市町村など)を取得する
QString PostalCodeToAddress::ParseAddresElem(const QString& src, const QString& elem_name) const
{
    QString regex = elem_name;
    regex += tr("=\"(.*)\"");

    QRegExp r(regex);
    r.setMinimal(true);

    if(!r.indexIn(src))
        return tr("");

    QStringList l = r.capturedTexts();
    if(l.size() != 2)
        return tr("");

    if(l[1] == tr("none"))
        return tr("");

    return l[1];
}


これでコンパイルすると完成。

ためしに、スカイツリーの郵便番号を入れてテストしてみると、
snapshot_051_120701_000936.png

と、このように正しく変換されることが確認できます。

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。