| Home | ![]() |
This example shows how to use the SOAP component to submit searches via the Google SOAP API.
Testing this example requires a valid license key, which is available for free from http://api.google.com/.
examples/google/google.h:
#ifndef GOOGLE_H_INCLUDED
#define GOOGLE_H_INCLUDED
#include <qwidget.h>
#include <qtsoap.h>
class QLineEdit;
class QTextBrowser;
class QPushButton;
class Google : public QWidget
{
Q_OBJECT
public:
Google(QWidget *parent = 0, const char *name = 0);
private slots:
void submitRequest();
void getResponse();
private:
QtSoapHttpTransport http;
QLineEdit *searchString;
QLineEdit *googleKey;
QTextBrowser *resultView;
QPushButton *quitButton;
QPushButton *searchButton;
QString key;
};
#endif
examples/google/google.cpp:
#include <qapplication.h>
#include <qmessagebox.h>
#include <qcursor.h>
#include <qfile.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qtextbrowser.h>
#include <qlayout.h>
#include <qpushbutton.h>
#include "google.h"
Google::Google(QWidget *parent, const char *name)
: QWidget(parent, name), http(this, "Google::http")
{
// Generate the GUI.
quitButton = new QPushButton("&Quit", this);
searchString = new QLineEdit(this);
resultView = new QTextBrowser(this);
resultView->setTextFormat(RichText);
QVBoxLayout *layout = new QVBoxLayout(this);
QLabel *gLabel = new QLabel("Google Web APIs license key: ", this);
googleKey = new QLineEdit(this);
QHBoxLayout *topBar = new QHBoxLayout(layout);
topBar->addWidget(gLabel);
topBar->addWidget(googleKey);
QLabel *sLabel = new QLabel("Search string: ", this);
QPushButton *searchButton = new QPushButton("Search!", this);
QHBoxLayout *searchBar = new QHBoxLayout(layout);
searchBar->addWidget(sLabel);
searchBar->addWidget(searchString);
searchBar->addWidget(searchButton);
layout->addWidget(resultView);
layout->addWidget(quitButton);
// Connect signals to slots. Note the submitRequest() slots.
connect(&http, SIGNAL(responseReady()), SLOT(getResponse()));
connect(quitButton, SIGNAL(clicked()), SLOT(close()));
connect(searchString, SIGNAL(returnPressed()), SLOT(submitRequest()));
connect(searchButton, SIGNAL(clicked()), SLOT(submitRequest()));
connect(googleKey, SIGNAL(returnPressed()), SLOT(submitRequest()));
// Pressing enter should trigger a search, unless focus has been
// explicitly moved.
searchButton->setDefault(true);
// Prepare to submit request.
http.setAction("urn:GoogleSearchAction");
http.setHost("api.google.com");
}
void Google::submitRequest()
{
// Check that the license key is set.
if (googleKey->text() == "") {
QMessageBox::warning(this, tr("Missing license key"),
tr("Please enter your Google Web APIs license key."
" If you do not have one, you can visit<br>"
" http://api.google.com/ and create a Google"
" account to obtain a license key."));
return;
}
// Check that we have a search string.
if (searchString->text() == "") {
QMessageBox::warning(this, tr("Missing search string"),
tr("Please enter a search string."));
return;
}
// Generate request. Details about how to generate a proper
// request are available from http://api.google.com/. The results
// are always fetched as latin1 in this example, but this can be
// easily changed (see the "ie" and "oe" arguments below).
QtSoapMessage request;
request.setMethod(QtSoapQName("doGoogleSearch", "urn:GoogleSearch"));
request.addMethodArgument("key", "", googleKey->text());
request.addMethodArgument("q", "", searchString->text());
request.addMethodArgument("start", "", 0);
request.addMethodArgument("maxResults", "", 10);
request.addMethodArgument("filter", "", false, 0);
request.addMethodArgument("restrict", "", "");
request.addMethodArgument("safeSearch", "", false, 0);
request.addMethodArgument("lr", "", "");
request.addMethodArgument("ie", "", "latin1");
request.addMethodArgument("oe", "", "latin1");
// Submit the method request to the web service.
http.submitRequest(request, "/search/beta2");
// Set the cursor to wait mode.
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
}
void Google::getResponse()
{
// Set cursor back to normal shape.
QApplication::restoreOverrideCursor();
// Reset resultView.
resultView->clear();
resultView->setContentsPos(0, 0);
// Get the response, check for error.
const QtSoapMessage &resp = http.getResponse();
if (resp.isFault()) {
resultView->setText(tr("<b>Query failed</b>: ")
+ resp.faultString().value().toString());
return;
}
// Extract the return value from this method response, check for
// errors.
const QtSoapType &res = resp.returnValue();
if (!res.isValid()) {
resultView->append(tr("Invalid return value"));
return;
}
// Generate resultView output. Make it resemble the actual web
// output from http://www.google.com/.
QString header;
header.sprintf(tr("Searched the web for <b>%s</b>, results %i - %i "
"of about %i. Search took %.2f seconds.<br><hr>"),
res["searchQuery"].toString().latin1(),
res["startIndex"].toInt(),
res["endIndex"].toInt(),
res["estimatedTotalResultsCount"].toInt(),
res["searchTime"].value().toDouble());
const QtSoapType &resultElements = res["resultElements"];
QString allElements;
for (int i = 0; i < resultElements.count(); ++i) {
const QtSoapType &resultElement = res["resultElements"][i];
QString cat = resultElement["directoryCategory"]["fullViewableName"].toString();
QString summary = resultElement["summary"].toString();
QString title = resultElement["title"].toString();
QString snippet = resultElement["snippet"].toString();
QString url = resultElement["URL"].toString();
QString cachedSize = resultElement["cachedSize"].toString();
QString thisElement = "<br>";
if (!title.isEmpty()) {
thisElement += "<font color=\"#0000FF\"><b><u>"
+ title + "</u></b></font><br>";
} else {
thisElement += "<font color=\"#0000FF\"><b><u>"
+ url + "</u></b></font><br>";
}
if (!snippet.isEmpty())
thisElement += snippet + "<br>";
if (!summary.isEmpty()) {
thisElement += "<font color=\"#808080\">Description:</font> "
+ summary + "<br>";
}
if (!cat.isEmpty()) {
thisElement += "<font color=\"#808080\">Category: <u>"
+ cat + "</u></font><br>";
}
if (!title.isEmpty()) {
thisElement += "<font color=\"#008000\"><u>" + url
+ "</u> - " + cachedSize + "</font><br>";
}
allElements += thisElement;
}
// Update the resultView.
resultView->setText(header + allElements);
}
examples/google/main.cpp:
#include <qapplication.h>
#include "google.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Google google;
app.setMainWidget(&google);
google.show();
return app.exec();
}
examples/google/google.pro:
TEMPLATE = app INCLUDEPATH += . CONFIG += debug include(../../src/qtsoap.pri) # Input HEADERS += google.h SOURCES += google.cpp main.cpp
| Copyright © 2003-2004 Trolltech | Trademarks | Qt Solutions
|