summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2014-02-24 12:49:05 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-04 14:46:11 +0100
commit2f758a7763960118305234b0cda4226747b56b14 (patch)
tree05b34c04656ad106c54ac2baba8d8671ac3fdcc3
parentc6be579a91c497d37e167155de243c6112f45db2 (diff)
Polish the webbrowser example.v5.3.0-beta1
Update address edit when the browser finishes loading. Add some rudimentary bookmark/history functionality. Add relevant default bookmarks and make qt-project.org the start page. Handle URLs passed on the command line. Change-Id: I21efeb5b4d2a05941407d308a96df7b024100f19 Reviewed-by: Topi Reiniƶ <topi.reinio@digia.com>
-rw-r--r--examples/activeqt/webbrowser/doc/src/webbrowser.qdoc4
-rw-r--r--examples/activeqt/webbrowser/main.cpp163
-rw-r--r--examples/activeqt/webbrowser/mainwindow.ui30
-rw-r--r--examples/activeqt/webbrowser/mainwindow_windowsmobile.ui30
4 files changed, 216 insertions, 11 deletions
diff --git a/examples/activeqt/webbrowser/doc/src/webbrowser.qdoc b/examples/activeqt/webbrowser/doc/src/webbrowser.qdoc
index be1ff34..07c2ef7 100644
--- a/examples/activeqt/webbrowser/doc/src/webbrowser.qdoc
+++ b/examples/activeqt/webbrowser/doc/src/webbrowser.qdoc
@@ -51,9 +51,7 @@
\snippet activeqt/webbrowser/main.cpp 1
The constructor initializes the user interface, installs a
- progress bar on the status bar, and uses QAxBase::dynamicCall()
- to invoke the \c GoHome() method of Internet Explorer to
- navigate to the user's home page.
+ progress bar on the status bar, and loads the bookmarks.
\snippet activeqt/webbrowser/main.cpp 2
Different slots handle the signals emitted by the WebBrowser object.
diff --git a/examples/activeqt/webbrowser/main.cpp b/examples/activeqt/webbrowser/main.cpp
index e65526d..76470bc 100644
--- a/examples/activeqt/webbrowser/main.cpp
+++ b/examples/activeqt/webbrowser/main.cpp
@@ -46,6 +46,9 @@
#include <QStatusBar>
#include <QMainWindow>
#include <QAbstractEventDispatcher>
+#include <QSignalMapper>
+#include <QVariant>
+#include <QSettings>
#if defined(Q_WS_WINCE_WM)
#include "ui_mainwindow_windowsmobile.h"
@@ -54,29 +57,107 @@
#include "ui_mainwindow.h"
#endif
+static const char qtProjectUrl[] = "qt-project.org";
+static const char iWebBrowser2DocumentationUrl[] = "http://msdn.microsoft.com/en-us/library/aa752127%28v=vs.85%29.aspx";
+
+struct Location {
+ Location(const QString &t = QString(), const QString &a = QString()) : title(t), address(a) {}
+
+ QString title;
+ QString address;
+};
+
+Q_DECLARE_METATYPE(Location)
+
+static QList<Location> defaultBookmarks()
+{
+ QList<Location> result;
+ result.append(Location(QStringLiteral("Qt Project"), QLatin1String(qtProjectUrl)));
+ result.append(Location(QStringLiteral("Digia"), QStringLiteral("http://qt.digia.com/")));
+ result.append(Location(QStringLiteral("IWebBrowser2 MSDN Documentation"), QLatin1String(iWebBrowser2DocumentationUrl)));
+ return result;
+}
+
+static bool containsAddress(const QList<Location> &locations, const QString &address)
+{
+ foreach (const Location &location, locations) {
+ if (location.address == address)
+ return true;
+ }
+ return false;
+}
+
+static inline Location locationFromAction(const QAction *action)
+{
+ return action->data().value<Location>();
+}
+
+static QList<Location> readBookMarks(QSettings &settings)
+{
+ QList<Location> result;
+ if (const int count = settings.beginReadArray(QStringLiteral("Bookmarks"))) {
+ const QString titleKey = QStringLiteral("title");
+ const QString addressKey = QStringLiteral("address");
+ for (int i = 0; i < count; ++i) {
+ settings.setArrayIndex(i);
+ result.append(Location(settings.value(titleKey).toString(),
+ settings.value(addressKey).toString()));
+ }
+ }
+ settings.endArray();
+ return result;
+}
+
+static void saveBookMarks(const QList<Location> &bookmarks, QSettings &settings)
+{
+ const int count = bookmarks.size();
+ settings.beginWriteArray(QStringLiteral("Bookmarks"));
+ const QString titleKey = QStringLiteral("title");
+ const QString addressKey = QStringLiteral("address");
+ for (int i = 0; i < count; ++i) {
+ settings.setArrayIndex(i);
+ settings.setValue(titleKey, bookmarks.at(i).title);
+ settings.setValue(addressKey, bookmarks.at(i).address);
+ }
+ settings.endArray();
+}
+
//! [0]
class MainWindow : public QMainWindow, public Ui::MainWindow
{
Q_OBJECT
public:
MainWindow();
+ ~MainWindow();
public slots:
+ void navigate(const QString &address);
void on_WebBrowser_TitleChange(const QString &title);
void on_WebBrowser_ProgressChange(int a, int b);
void on_WebBrowser_CommandStateChange(int cmd, bool on);
void on_WebBrowser_BeforeNavigate();
- void on_WebBrowser_NavigateComplete(QString);
+ void on_WebBrowser_NavigateComplete(const QString &address);
void on_actionGo_triggered();
void on_actionNewWindow_triggered();
+ void on_actionAddBookmark_triggered();
void on_actionAbout_triggered();
void on_actionAboutQt_triggered();
void on_actionFileClose_triggered();
private:
+ inline const QString address() const
+ { return addressEdit->text().trimmed(); }
+ QList<Location> bookmarks() const;
+ QAction *addLocation(const Location &location, QMenu *menu);
+ inline void addBookmark(const Location &location)
+ { bookmarkActions << addLocation(location, BookmarksMenu); }
+
QProgressBar *pb;
QLineEdit *addressEdit;
+ QList<QAction *> bookmarkActions;
+ QList<QAction *> historyActions;
+ QSignalMapper locationActionMapper;
};
//! [0] //! [1]
@@ -101,13 +182,66 @@ MainWindow::MainWindow()
pb->hide();
statusBar()->addPermanentWidget(pb);
- WebBrowser->dynamicCall("GoHome()");
+ connect(&locationActionMapper, SIGNAL(mapped(QString)), this, SLOT(navigate(QString)));
+
+ QSettings settings(QSettings::IniFormat, QSettings::UserScope,
+ QCoreApplication::organizationName(), QCoreApplication::applicationName());
+ QList<Location> bookmarks = readBookMarks(settings);
+ if (bookmarks.isEmpty())
+ bookmarks = defaultBookmarks();
+ foreach (const Location &bookmark, bookmarks)
+ addBookmark(bookmark);
+}
+
+//! [1]
+
+MainWindow::~MainWindow()
+{
+ QSettings settings(QSettings::IniFormat, QSettings::UserScope,
+ QCoreApplication::organizationName(), QCoreApplication::applicationName());
+ saveBookMarks(bookmarks(), settings);
+}
+
+QAction *MainWindow::addLocation(const Location &location, QMenu *menu)
+{
+ QAction *action = menu->addAction(location.title);
+ action->setData(QVariant::fromValue(location));
+ locationActionMapper.setMapping(action, location.address);
+ connect(action, SIGNAL(triggered()), &locationActionMapper, SLOT(map()));
+ return action;
+}
+
+QList<Location> MainWindow::bookmarks() const
+{
+ QList<Location> result;
+ foreach (const QAction *action, bookmarkActions)
+ result.append(locationFromAction(action));
+ return result;
+}
+
+void MainWindow::on_actionAddBookmark_triggered()
+{
+ if (!historyActions.isEmpty()) {
+ const Location location = locationFromAction(historyActions.last());
+ if (!containsAddress(bookmarks(), location.address))
+ addBookmark(location);
+ }
}
-//! [1] //! [2]
+//! [2]
void MainWindow::on_WebBrowser_TitleChange(const QString &title)
{
+ // This is called multiple times after NavigateComplete().
+ // Add new URLs to history here.
setWindowTitle("Qt WebBrowser - " + title);
+ const QString currentAddress = address();
+ const QString historyAddress = historyActions.isEmpty() ?
+ QString() : locationFromAction(historyActions.last()).address;
+ if (currentAddress.isEmpty() || currentAddress == "about:blank" || currentAddress == historyAddress)
+ return;
+ historyActions << addLocation(Location(title, currentAddress), HistoryMenu);
+ if (historyActions.size() > 10)
+ delete historyActions.takeFirst();
}
void MainWindow::on_WebBrowser_ProgressChange(int a, int b)
@@ -138,15 +272,25 @@ void MainWindow::on_WebBrowser_BeforeNavigate()
actionStop->setEnabled(true);
}
-void MainWindow::on_WebBrowser_NavigateComplete(QString)
+void MainWindow::on_WebBrowser_NavigateComplete(const QString &url)
{
actionStop->setEnabled(false);
+ const bool blocked = addressEdit->blockSignals(true);
+ addressEdit->setText(url);
+ addressEdit->blockSignals(blocked);
}
-//! [2] //! [3]
+//! [3]
void MainWindow::on_actionGo_triggered()
{
- WebBrowser->dynamicCall("Navigate(const QString&)", addressEdit->text());
+ navigate(address());
+}
+
+//! [2]
+
+void MainWindow::navigate(const QString &url)
+{
+ WebBrowser->dynamicCall("Navigate(const QString&)", url);
}
void MainWindow::on_actionNewWindow_triggered()
@@ -184,7 +328,14 @@ void MainWindow::on_actionFileClose_triggered()
int main(int argc, char ** argv)
{
QApplication a(argc, argv);
+ QCoreApplication::setApplicationVersion(QT_VERSION_STR);
+ QCoreApplication::setApplicationName("Active Qt Web Browser");
+ QCoreApplication::setOrganizationName("QtProject");
MainWindow w;
+ const QStringList arguments = QCoreApplication::arguments();
+ const QString url = arguments.size() > 1 ?
+ arguments.at(1) : QString::fromLatin1(qtProjectUrl);
+ w.navigate(url);
#if defined(Q_OS_WINCE)
w.showMaximized();
#else
diff --git a/examples/activeqt/webbrowser/mainwindow.ui b/examples/activeqt/webbrowser/mainwindow.ui
index 9af0f8e..0117771 100644
--- a/examples/activeqt/webbrowser/mainwindow.ui
+++ b/examples/activeqt/webbrowser/mainwindow.ui
@@ -114,7 +114,25 @@
<addaction name="separator" />
<addaction name="actionFileClose" />
</widget>
- <widget class="QMenu" name="unnamed" >
+ <widget class="QMenu" name="BookmarksMenu" >
+ <property name="objectName" >
+ <string notr="true" >BookmarksMenu</string>
+ </property>
+ <property name="title" >
+ <string>&amp;Bookmarks</string>
+ </property>
+ <addaction name="actionAddBookmark" />
+ <addaction name="separator" />
+ </widget>
+ <widget class="QMenu" name="HistoryMenu" >
+ <property name="objectName" >
+ <string notr="true" >HistoryMenu</string>
+ </property>
+ <property name="title" >
+ <string>Hi&amp;story</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="unnamed" >
<property name="objectName" >
<string notr="true" >unnamed</string>
</property>
@@ -125,6 +143,8 @@
<addaction name="actionAboutQt" />
</widget>
<addaction name="PopupMenu" />
+ <addaction name="BookmarksMenu" />
+ <addaction name="HistoryMenu" />
<addaction name="unnamed" />
</widget>
<action name="actionGo" >
@@ -226,6 +246,14 @@
<string>About</string>
</property>
</action>
+ <action name="actionAddBookmark" >
+ <property name="objectName" >
+ <string>actionAddBookmark</string>
+ </property>
+ <property name="text" >
+ <string>Add Bookmark</string>
+ </property>
+ </action>
<action name="actionAboutQt" >
<property name="objectName" >
<string>actionAboutQt</string>
diff --git a/examples/activeqt/webbrowser/mainwindow_windowsmobile.ui b/examples/activeqt/webbrowser/mainwindow_windowsmobile.ui
index 768dc43..29cdc6d 100644
--- a/examples/activeqt/webbrowser/mainwindow_windowsmobile.ui
+++ b/examples/activeqt/webbrowser/mainwindow_windowsmobile.ui
@@ -114,7 +114,25 @@
<addaction name="separator" />
<addaction name="actionFileClose" />
</widget>
- <widget class="QMenu" name="unnamed" >
+ <widget class="QMenu" name="BookmarksMenu" >
+ <property name="objectName" >
+ <string notr="true" >BookmarksMenu</string>
+ </property>
+ <property name="title" >
+ <string>&amp;Bookmarks</string>
+ </property>
+ <addaction name="actionAddBookmark" />
+ <addaction name="separator" />
+ </widget>
+ <widget class="QMenu" name="HistoryMenu" >
+ <property name="objectName" >
+ <string notr="true" >HistoryMenu</string>
+ </property>
+ <property name="title" >
+ <string>Hi&amp;story</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="unnamed" >
<property name="objectName" >
<string notr="true" >unnamed</string>
</property>
@@ -125,6 +143,8 @@
<addaction name="actionAboutQt" />
</widget>
<addaction name="PopupMenu" />
+ <addaction name="BookmarksMenu" />
+ <addaction name="HistoryMenu" />
<addaction name="unnamed" />
</widget>
<action name="actionGo" >
@@ -226,6 +246,14 @@
<string>About</string>
</property>
</action>
+ <action name="actionAddBookmark" >
+ <property name="objectName" >
+ <string>actionAddBookmark</string>
+ </property>
+ <property name="text" >
+ <string>Add Bookmark</string>
+ </property>
+ </action>
<action name="actionAboutQt" >
<property name="objectName" >
<string>actionAboutQt</string>