Hari ini saya sedang mengoprek di Qt, bagaimana caranya mengakses dokumen web lewat HTTP setelah sebelumnya saya mengoprek masalah Google MAPS API. Sekarang, saatnya kita bermain dengan Google Translate API (sepertinya saya senang sekali dengan google...).
Baiklah langsung saja, Jadi, intinya saya membuat Class baru yang bernama QGtransNet yang merupakan kelas utama dalam hal mash-up ke google Translate.
Oh iya, saya hanya memberi contoh potongan kode yang penting saja. Jika Anda ingin mendapatkan source code komplit, silakan Kirim Email ke saya, saya akan langsung berikan. saya OL tiap hari, jadi tenang saja....
isi file qgtransnet.h (langsung ke declare Class)
class QGtransNet : public QObject {
Q_OBJECT
public:
/**
* Konstruktor
**/
QGtransNet(const QString &From, const QString &To, const QString &version);
/**
* Method utama untuk melakukan translate
* Hasil translate di tampung di String Hasil dan
* langsung ditampilkan di komponen UI yang disesuaikan
**/
void Translate(const QString &text);
/**
* Method untuk masalah DEBUGGING
* Echoing hasil
**/
QString debug();
//bagian yang ini silakan disesuaikan
/**
* SETTER UI
**/
void setUI(QTextEdit *textedit);
public slots:
/**
* Slot yang diinvokasi saat sudah dapat response dari SERVER
**/
void replyFinished(QNetworkReply *);
/**
* Slot penanganan Error
**/
void replyError();
signals:
/**
* Signal buatan sendiri => error
**/
void takNyambung();
private:
QNetworkAccessManager * manager;
QString *BaseURL;
QString *version;
QString *From;
QString *To;
bool onProgress;
// tempat menyimpan hasil translate
QString *hasil;
//Bagian yang ini silakan disesuaikan
QTextEdit *textedit;
};
Berikutnya file qgtransnet.cpp (yang merupakan implementasi), penjelasan detil ada pad komentar kode:
#include "qgtransnet.h"
/**
* Konstruktor
**/
QGtransNet::QGtransNet(const QString &From, const QString &To, const QString &version)
{
// inisialisasi some variables/attributes
this->BaseURL = new QString("http://ajax.googleapis.com/ajax/services/language/translate");
this->version = new QString(version);
this->From = new QString(From);
this->To = new QString(To);
this->onProgress = false;
// siap - siap pemasangan network
this->manager = new QNetworkAccessManager(this);
connect(this->manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
connect(this, SIGNAL(takNyambung()), this, SLOT(replyError()));
}
/**
* Method utama untuk melakukan translate
* Hasil translate di tampung di String Hasil dan
* langsung ditampilkan di komponen UI yang disesuaikan
**/
void QGtransNet::Translate(const QString &text)
{
//jika sedang Progress Method ini HARAAAMMM!!
if (this->onProgress || text.isEmpty())
{
return;
}
//set request-string
QString requestStr( tr("%1?v=%2&q=%3&langpair=%4|%5")
.arg(this->BaseURL->append(""))
.arg(this->version->append(""))
.arg(text)
.arg(this->From->append(""))
.arg(this->To->append("")));
//QString urlencoded(QUrl::toPercentEncoding(requestStr,":/&=?", "| "));
// ambil hasil translate dari server google
//this->manager->get(QNetworkRequest(urlencoded));
//QNetworkReply * reply = this->manager->get(QNetworkRequest(QUrl(requestStr))); //otomatis Encoded sepertinya
this->manager->get(QNetworkRequest(QUrl(requestStr))); //otomatis Encoded sepertinya
this->onProgress = true;
//synchronous
/*
if (reply->waitForReadyRead(-1))
{
QString replyStr(reply->readAll());
return replyStr;
}
*/
//Set UI waiting...
this->textedit->setText("Loading data hasil translate.....");
}
/**
* Slot yang diinvokasi saat sudah dapat response dari SERVER
**/
void QGtransNet::replyFinished(QNetworkReply * reply)
{
// hasilnya merupakan struktur JSON, harus di parse lagi
// misal parse pakai delimiter karakter "
QString temp(reply->readAll());
QStringList slist = temp.split("\"");
//Kalau panjang < 5 asumsi => tak ada response => mungkin putus/jaringan sibuk
if (slist.count() < 6)
{
emit(takNyambung());
return;
}
// Format JSON nya
// {"responseData": {"translatedText":"Hasil"}, "responseDetails": null, "responseStatus": 200}
// jika delimiternya \" => maka hasil ada di Index ke - 5
this->hasil = new QString (slist[5]);
this->onProgress = false;
//set Hasil di UI
if (!this->hasil->isEmpty())//NOT NULL
{
this->textedit->setText(this->hasil->append(""));
}
else
{
this->textedit->setText("Jaringan Sibuk !");
}
}
/**
* Slot penanganan Error
**/
void QGtransNet::replyError()
{
this->textedit->setText("Tidak tersambung dengan Server...");
}
/**
* Method untuk masalah DEBUGGING
* Echoing hasil
**/
QString QGtransNet::debug()
{
return this->hasil->append("");
}
//bagian yang ini silakan disesuaikan
/**
* SETTER UI
**/
void QGtransNet::setUI(QTextEdit *textedit)
{
this->textedit = textedit;
}
thank bang informasinya. minta tolong diemailkan dong source codenya. makasih infonya :)
BalasHapus