diff options
Diffstat (limited to 'examples/activeqt')
19 files changed, 443 insertions, 750 deletions
diff --git a/examples/activeqt/activeqt.pro b/examples/activeqt/activeqt.pro index 97b22bd..6f189bc 100644 --- a/examples/activeqt/activeqt.pro +++ b/examples/activeqt/activeqt.pro @@ -6,10 +6,9 @@ SUBDIRS += comapp \ simple \ wrapper -contains(QT_CONFIG, shared):SUBDIRS += webbrowser +contains(QT_CONFIG, shared):SUBDIRS += mediaplayer contains(QT_CONFIG, opengl):!contains(QT_CONFIG, opengles2): SUBDIRS += opengl qtHaveModule(quickcontrols2):SUBDIRS += simpleqml -# For now only the contain examples with mingw, for the others you need -# an IDL compiler -mingw:SUBDIRS = webbrowser +# Other examples need an IDL compiler +mingw:SUBDIRS = mediaplayer diff --git a/examples/activeqt/mediaplayer/doc/images/activeqt-mediaplayer-example.jpg b/examples/activeqt/mediaplayer/doc/images/activeqt-mediaplayer-example.jpg Binary files differnew file mode 100644 index 0000000..4839242 --- /dev/null +++ b/examples/activeqt/mediaplayer/doc/images/activeqt-mediaplayer-example.jpg diff --git a/examples/activeqt/mediaplayer/doc/src/mediaplayer.qdoc b/examples/activeqt/mediaplayer/doc/src/mediaplayer.qdoc new file mode 100644 index 0000000..6043a6a --- /dev/null +++ b/examples/activeqt/mediaplayer/doc/src/mediaplayer.qdoc @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example activeqt/mediaplayer + \title Media Player Example (ActiveQt) + + \brief The Media Player example uses the Microsoft Media Player + ActiveX control to implement a functional media player application. + + \image activeqt-mediaplayer-example.jpg + + \e {Media Player} demonstrates how a Qt application can communicate with + embedded ActiveX controls using signals, slots, and the \c dynamicCall() + function. + + \quotefromfile activeqt/mediaplayer/main.cpp + \skipto class MainWindow + \printuntil /^\}/ + + The \c MainWindow class declares a \c QMainWindow based user interface, + using the \c Ui::MainWindow class created by Qt Designer. A number + of slots are implemented to handle events from user interface elements, + including the \c mediaPlayer object, which is a QAxWidget hosting + the Microsoft Media Player ActiveX control. + + \quotefromfile activeqt/mediaplayer/main.cpp + \skipto MainWindow::MainWindow() + \printuntil /^\}/ + + The constructor initializes the user interface, restores a previously + saved window geometry, and uses the \c dynamicCall() function to invoke + the APIs implemented by the Microsoft Media Player ActiveX control, + to set initial configuration parameters. + + \quotefromfile activeqt/mediaplayer/main.cpp + \skipto MainWindow::on_mediaPlayer_PlayStateChange + \printuntil /^\}/ + + The \c on_mediaPlayer_PlayStateChange slot handles the signal emitted + by the \c mediaPlayer object when its state changes. + + \quotefromfile activeqt/mediaplayer/main.cpp + \skipto MainWindow::openMedia + \printuntil /^\}/ + + The \c openMedia() function allows a media file to be opened by using + the \c dynamicCall() function to set the URL property in the ActiveX + control, which causes the media file to be loaded and played. + + \quotefromfile activeqt/mediaplayer/main.cpp + \skipto int main + \printuntil /^\}/ + + The \c main() function starts the application using standard Qt APIs + and uses an optional command line argument as the name of a media + file to be loaded by the player. + + To build the example, you must first build the QAxContainer + library. Then run your make tool in + \c examples/activeqt/mediaplayer and run the resulting + \c mediaplayer.exe. +*/ diff --git a/examples/activeqt/mediaplayer/main.cpp b/examples/activeqt/mediaplayer/main.cpp new file mode 100644 index 0000000..c20f262 --- /dev/null +++ b/examples/activeqt/mediaplayer/main.cpp @@ -0,0 +1,193 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> +#include <QMessageBox> +#include <QMainWindow> +#include <QDesktopWidget> +#include <QVariant> +#include <QSettings> +#include <QFileDialog> +#include <QCommandLineParser> + +#include "ui_mainwindow.h" + +static const char geometryKey[] = "Geometry"; + +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(); + ~MainWindow(); + void openMedia(const QString &mediaUrl); + +public slots: + void on_mediaPlayer_PlayStateChange(int newState); + void on_actionOpen_triggered(); + void on_actionExit_triggered(); + void on_actionAbout_triggered(); + void on_actionAboutQt_triggered(); + +private: + void updateWindowTitle(const QString &state); + Ui::MainWindow m_ui; +}; + +MainWindow::MainWindow() +{ + m_ui.setupUi(this); + + QSettings settings(QSettings::IniFormat, QSettings::UserScope, + QCoreApplication::organizationName(), QCoreApplication::applicationName()); + + const QByteArray restoredGeometry = settings.value(QLatin1String(geometryKey)).toByteArray(); + if (restoredGeometry.isEmpty() || !restoreGeometry(restoredGeometry)) { + const QRect availableGeometry = QApplication::desktop()->availableGeometry(this); + const QSize size = (availableGeometry.size() * 4) / 5; + resize(size); + move(availableGeometry.center() - QPoint(size.width(), size.height()) / 2); + } + + m_ui.mediaPlayer->dynamicCall("enableContextMenu", false); + m_ui.mediaPlayer->dynamicCall("stretchToFit", true); + updateWindowTitle(""); +} + +MainWindow::~MainWindow() +{ + QSettings settings(QSettings::IniFormat, QSettings::UserScope, + QCoreApplication::organizationName(), QCoreApplication::applicationName()); + settings.setValue(QLatin1String(geometryKey), saveGeometry()); +} + +void MainWindow::on_mediaPlayer_PlayStateChange(int newState) +{ + static const QHash<int, const char *> stateMapping { + {1, "Stopped"}, + {2, "Paused"}, + {3, "Playing"}, + {4, "Scanning Forwards"}, + {5, "Scanning Backwards"}, + {6, "Buffering"}, + {7, "Waiting"}, + {8, "Media Ended"}, + {9, "Transitioning"}, + {10, "Ready"}, + {11, "Reconnecting"}, + }; + const char *stateStr = stateMapping.value(newState, ""); + updateWindowTitle(tr(stateStr)); +} + +void MainWindow::on_actionOpen_triggered() +{ + QFileDialog fileDialog(this, tr("Open File")); + fileDialog.setAcceptMode(QFileDialog::AcceptOpen); + fileDialog.setFileMode(QFileDialog::ExistingFile); + fileDialog.setMimeTypeFilters({ "application/octet-stream", "video/x-msvideo", "video/mp4", "audio/mpeg", "audio/mp4" }); + if (fileDialog.exec() == QDialog::Accepted) + openMedia(fileDialog.selectedFiles().first()); +} + +void MainWindow::on_actionExit_triggered() +{ + QCoreApplication::quit(); +} + +void MainWindow::on_actionAbout_triggered() +{ + QMessageBox::about(this, tr("About Media Player"), + tr("This Example has been created using the ActiveQt integration into Qt Designer.\n" + "It demonstrates the use of QAxWidget to embed the Windows Media Player ActiveX\n" + "control into a Qt application.")); +} + +void MainWindow::on_actionAboutQt_triggered() +{ + QMessageBox::aboutQt(this, tr("About Qt")); +} + +void MainWindow::openMedia(const QString &mediaUrl) +{ + if (!mediaUrl.isEmpty()) + m_ui.mediaPlayer->dynamicCall("URL", mediaUrl); +} + +void MainWindow::updateWindowTitle(const QString &state) +{ + QString appName = QCoreApplication::applicationName(); + QString title = state.isEmpty() ? appName : + QString("%1 (%2)").arg(appName, state); + setWindowTitle(title); +} + +#include "main.moc" + +int main(int argc, char *argv[]) +{ + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication app(argc, argv); + QCoreApplication::setApplicationVersion(QT_VERSION_STR); + QCoreApplication::setApplicationName(QLatin1String("Active Qt Media Player")); + QCoreApplication::setOrganizationName(QLatin1String("QtProject")); + + MainWindow w; + QCommandLineParser parser; + parser.setApplicationDescription(QCoreApplication::applicationName()); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument("file", "The media file to open."); + parser.process(app); + if (!parser.positionalArguments().isEmpty()) + w.openMedia(parser.positionalArguments().constFirst()); + w.show(); + return app.exec(); +} diff --git a/examples/activeqt/mediaplayer/mainwindow.ui b/examples/activeqt/mediaplayer/mainwindow.ui new file mode 100644 index 0000000..b83d392 --- /dev/null +++ b/examples/activeqt/mediaplayer/mainwindow.ui @@ -0,0 +1,147 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>794</width> + <height>599</height> + </rect> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="windowTitle"> + <string>Qt Media Player</string> + </property> + <widget class="QWidget" name="centralWidget"> + <layout class="QHBoxLayout" name="unnamed"> + <property name="spacing"> + <number>6</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QFrame" name="Frame"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <layout class="QVBoxLayout" name="unnamed"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>1</number> + </property> + <property name="topMargin"> + <number>1</number> + </property> + <property name="rightMargin"> + <number>1</number> + </property> + <property name="bottomMargin"> + <number>1</number> + </property> + <item> + <widget class="MediaAxWidget" name="mediaPlayer"> + <property name="control" stdset="0"> + <string>{6bf52a52-394a-11d3-b153-00c04f79faa6}</string> + </property> + <property name="sizePolicy" stdset="0"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menubar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>794</width> + <height>21</height> + </rect> + </property> + <widget class="QMenu" name="PopupMenu"> + <property name="title"> + <string>&File</string> + </property> + <addaction name="actionOpen"/> + <addaction name="actionExit"/> + </widget> + <widget class="QMenu" name="menuHelp"> + <property name="title"> + <string>&Help</string> + </property> + <addaction name="actionAbout"/> + <addaction name="actionAboutQt"/> + </widget> + <addaction name="PopupMenu"/> + <addaction name="menuHelp"/> + </widget> + <action name="actionOpen"> + <property name="text"> + <string>&Open</string> + </property> + </action> + <action name="actionExit"> + <property name="text"> + <string>E&xit</string> + </property> + </action> + <action name="actionAbout"> + <property name="text"> + <string>&About</string> + </property> + </action> + <action name="actionAboutQt"> + <property name="text"> + <string>About &Qt</string> + </property> + </action> + <actiongroup name="FileNewGroup"/> + </widget> + <layoutdefault spacing="6" margin="11"/> + <customwidgets> + <customwidget> + <class>QAxWidget</class> + <extends>QWidget</extends> + <header>qaxwidget.h</header> + </customwidget> + <customwidget> + <class>MediaAxWidget</class> + <extends>QAxWidget</extends> + <header>mediaaxwidget.h</header> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/examples/activeqt/webbrowser/webaxwidget.h b/examples/activeqt/mediaplayer/mediaaxwidget.h index 9a15a72..a57ca05 100644 --- a/examples/activeqt/webbrowser/webaxwidget.h +++ b/examples/activeqt/mediaplayer/mediaaxwidget.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -48,28 +48,29 @@ ** ****************************************************************************/ -#ifndef WEBAXWIDGET_H -#define WEBAXWIDGET_H +#ifndef MEDIAAXWIDGET_H +#define MEDIAAXWIDGET_H #include <ActiveQt/QAxWidget> -#include "windows.h" +#include <qt_windows.h> -class WebAxWidget : public QAxWidget +// Overrides the translateKeyEvent() function to pass keystrokes +// to the Windows Media Player ActiveX control. +class MediaAxWidget : public QAxWidget { public: - - WebAxWidget(QWidget *parent = nullptr, Qt::WindowFlags f = 0) + MediaAxWidget(QWidget *parent = nullptr, Qt::WindowFlags f = 0) : QAxWidget(parent, f) { } + protected: - bool translateKeyEvent(int message, int keycode) const Q_DECL_OVERRIDE + bool translateKeyEvent(int message, int keycode) const override { if (message >= WM_KEYFIRST && message <= WM_KEYLAST) return true; return QAxWidget::translateKeyEvent(message, keycode); } - }; -#endif // WEBAXWIDGET_H +#endif // MEDIAAXWIDGET_H diff --git a/examples/activeqt/webbrowser/webbrowser.pro b/examples/activeqt/mediaplayer/mediaplayer.pro index 76a791c..ad787a3 100644 --- a/examples/activeqt/webbrowser/webbrowser.pro +++ b/examples/activeqt/mediaplayer/mediaplayer.pro @@ -2,11 +2,10 @@ TEMPLATE = app QT += widgets axcontainer -HEADERS = webaxwidget.h +HEADERS = mediaaxwidget.h SOURCES = main.cpp FORMS = mainwindow.ui -RESOURCES += webbrowser.qrc # install -target.path = $$[QT_INSTALL_EXAMPLES]/activeqt/webbrowser +target.path = $$[QT_INSTALL_EXAMPLES]/activeqt/mediaplayer INSTALLS += target diff --git a/examples/activeqt/webbrowser/doc/images/activeqt-webbrowser-example.png b/examples/activeqt/webbrowser/doc/images/activeqt-webbrowser-example.png Binary files differdeleted file mode 100644 index 0bb451a..0000000 --- a/examples/activeqt/webbrowser/doc/images/activeqt-webbrowser-example.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/doc/src/webbrowser.qdoc b/examples/activeqt/webbrowser/doc/src/webbrowser.qdoc deleted file mode 100644 index b8215bd..0000000 --- a/examples/activeqt/webbrowser/doc/src/webbrowser.qdoc +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example activeqt/webbrowser - \title Web Browser Example (ActiveQt) - - \brief The Web Browser example uses the Microsoft Web Browser - ActiveX control to implement a fully functional Web Browser - application. The user interface has been developed using the Qt - Designer integration of the QAxWidget class. - - \image activeqt-webbrowser-example.png - - The code demonstrates how the Qt application can communicate - with the embedded ActiveX controls using signals, slots and the - dynamicCall() function. - - \snippet activeqt/webbrowser/main.cpp 0 - - The \c MainWindow class declares a \c QMainWindow based user interface, - using the \c Ui::MainWindow class generated by Qt Designer. A number - of slots are implemented to handle events from the various user - interface elements, including the \c WebBrowser object, which is a - QAxWidget hosting the Microsoft Web Browser control. - - \snippet activeqt/webbrowser/main.cpp 1 - - The constructor initializes the user interface, installs a - 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. - - Connections that don't require any coding, i.e. connecting the \c back - action to the \c GoBack() slot, have already been made in Qt Designer. - - \snippet activeqt/webbrowser/main.cpp 3 - \snippet activeqt/webbrowser/main.cpp 4 - - The rest of the implementation is not related to ActiveQt - the actions - are handled by different slots, and the entry point function starts the - application using standard Qt APIs. - - To build the example you must first build the QAxContainer - library. Then run your make tool in \c - examples/activeqt/webbrowser and run the resulting \c - webbrowser.exe. -*/ diff --git a/examples/activeqt/webbrowser/images/back.png b/examples/activeqt/webbrowser/images/back.png Binary files differdeleted file mode 100644 index ca100f6..0000000 --- a/examples/activeqt/webbrowser/images/back.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/images/forward.png b/examples/activeqt/webbrowser/images/forward.png Binary files differdeleted file mode 100644 index 833cbfa..0000000 --- a/examples/activeqt/webbrowser/images/forward.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/images/go.png b/examples/activeqt/webbrowser/images/go.png Binary files differdeleted file mode 100644 index 8aaf835..0000000 --- a/examples/activeqt/webbrowser/images/go.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/images/home.png b/examples/activeqt/webbrowser/images/home.png Binary files differdeleted file mode 100644 index 51dc56d..0000000 --- a/examples/activeqt/webbrowser/images/home.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/images/refresh.png b/examples/activeqt/webbrowser/images/refresh.png Binary files differdeleted file mode 100644 index cd24b5f..0000000 --- a/examples/activeqt/webbrowser/images/refresh.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/images/search.png b/examples/activeqt/webbrowser/images/search.png Binary files differdeleted file mode 100644 index 4f1e1ca..0000000 --- a/examples/activeqt/webbrowser/images/search.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/images/stop.png b/examples/activeqt/webbrowser/images/stop.png Binary files differdeleted file mode 100644 index ded466c..0000000 --- a/examples/activeqt/webbrowser/images/stop.png +++ /dev/null diff --git a/examples/activeqt/webbrowser/main.cpp b/examples/activeqt/webbrowser/main.cpp deleted file mode 100644 index 6d6d6d5..0000000 --- a/examples/activeqt/webbrowser/main.cpp +++ /dev/null @@ -1,359 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QApplication> -#include <QMessageBox> -#include <QProgressBar> -#include <QLineEdit> -#include <QLabel> -#include <QStatusBar> -#include <QMainWindow> -#include <QDesktopWidget> -#include <QAbstractEventDispatcher> -#include <QSignalMapper> -#include <QVariant> -#include <QSettings> - -#include "ui_mainwindow.h" - -static const char qtUrl[] = "qt.io"; -static const char iWebBrowser2DocumentationUrl[] = "http://msdn.microsoft.com/en-us/library/aa752127%28v=vs.85%29.aspx"; -static const char versionKey[] = "Version"; -static const char geometryKey[] = "Geometry"; - -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"), QLatin1String(qtUrl))); - 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) -{ - for (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: - explicit MainWindow(); - virtual ~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(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 m_addressEdit->text().trimmed(); } - QList<Location> bookmarks() const; - QAction *addLocation(const Location &location, QMenu *menu); - inline void addBookmark(const Location &location) - { m_bookmarkActions << addLocation(location, BookmarksMenu); } - - QProgressBar *m_progressBar; - QLineEdit *m_addressEdit; - QList<QAction *> m_bookmarkActions; - QList<QAction *> m_historyActions; - QSignalMapper m_locationActionMapper; -}; -//! [0] //! [1] - -MainWindow::MainWindow() -{ - setupUi(this); - - m_addressEdit = new QLineEdit; - tbAddress->insertWidget(actionGo, new QLabel(tr("Address"))); - tbAddress->insertWidget(actionGo, m_addressEdit); - - connect(m_addressEdit, SIGNAL(returnPressed()), actionGo, SLOT(trigger())); - - connect(actionBack, SIGNAL(triggered()), WebBrowser, SLOT(GoBack())); - connect(actionForward, SIGNAL(triggered()), WebBrowser, SLOT(GoForward())); - connect(actionStop, SIGNAL(triggered()), WebBrowser, SLOT(Stop())); - connect(actionRefresh, SIGNAL(triggered()), WebBrowser, SLOT(Refresh())); - connect(actionHome, SIGNAL(triggered()), WebBrowser, SLOT(GoHome())); - connect(actionSearch, SIGNAL(triggered()), WebBrowser, SLOT(GoSearch())); - - m_progressBar = new QProgressBar(statusBar()); - m_progressBar->setTextVisible(false); - m_progressBar->hide(); - statusBar()->addPermanentWidget(m_progressBar); - - connect(&m_locationActionMapper, QOverload<const QString &>::of(&QSignalMapper::mapped), this, &MainWindow::navigate); - - QSettings settings(QSettings::IniFormat, QSettings::UserScope, - QCoreApplication::organizationName(), QCoreApplication::applicationName()); - const QByteArray restoredGeometry = settings.value(QLatin1String(geometryKey)).toByteArray(); - if (restoredGeometry.isEmpty() || !restoreGeometry(restoredGeometry)) { - const QRect availableGeometry = QApplication::desktop()->availableGeometry(this); - const QSize size = (availableGeometry.size() * 4) / 5; - resize(size); - move(availableGeometry.center() - QPoint(size.width(), size.height()) / 2); - } - const QString restoredVersion = settings.value(QLatin1String(versionKey)).toString(); - QList<Location> bookmarks = readBookMarks(settings); - if (bookmarks.isEmpty() || restoredVersion.isEmpty()) - bookmarks = defaultBookmarks(); - for (const Location &bookmark : qAsConst(bookmarks)) - addBookmark(bookmark); -} - -//! [1] - -MainWindow::~MainWindow() -{ - QSettings settings(QSettings::IniFormat, QSettings::UserScope, - QCoreApplication::organizationName(), QCoreApplication::applicationName()); - saveBookMarks(bookmarks(), settings); - settings.setValue(QLatin1String(versionKey), QLatin1String(QT_VERSION_STR)); - settings.setValue(QLatin1String(geometryKey), saveGeometry()); -} - -QAction *MainWindow::addLocation(const Location &location, QMenu *menu) -{ - QAction *action = menu->addAction(location.title); - action->setData(QVariant::fromValue(location)); - m_locationActionMapper.setMapping(action, location.address); - connect(action, &QAction::triggered, &m_locationActionMapper, QOverload<>::of(&QSignalMapper::map)); - return action; -} - -QList<Location> MainWindow::bookmarks() const -{ - QList<Location> result; - for (const QAction *action : qAsConst(m_bookmarkActions)) - result.append(locationFromAction(action)); - return result; -} - -void MainWindow::on_actionAddBookmark_triggered() -{ - if (!m_historyActions.isEmpty()) { - const Location location = locationFromAction(m_historyActions.last()); - if (!containsAddress(bookmarks(), location.address)) - addBookmark(location); - } -} - -//! [2] -void MainWindow::on_WebBrowser_TitleChange(const QString &title) -{ - // This is called multiple times after NavigateComplete(). - // Add new URLs to history here. - setWindowTitle(tr("Qt WebBrowser - ") + title); - const QString currentAddress = address(); - const QString historyAddress = m_historyActions.isEmpty() ? - QString() : locationFromAction(m_historyActions.last()).address; - if (currentAddress.isEmpty() || currentAddress == QStringLiteral("about:blank") || currentAddress == historyAddress) - return; - m_historyActions << addLocation(Location(title, currentAddress), HistoryMenu); - if (m_historyActions.size() > 10) - delete m_historyActions.takeFirst(); -} - -void MainWindow::on_WebBrowser_ProgressChange(int a, int b) -{ - if (a <= 0 || b <= 0) { - m_progressBar->hide(); - return; - } - m_progressBar->setRange(0, b); - m_progressBar->setValue(a); - m_progressBar->show(); -} - -void MainWindow::on_WebBrowser_CommandStateChange(int cmd, bool on) -{ - switch (cmd) { - case 1: - actionForward->setEnabled(on); - break; - case 2: - actionBack->setEnabled(on); - break; - } -} - -void MainWindow::on_WebBrowser_BeforeNavigate() -{ - actionStop->setEnabled(true); -} - -void MainWindow::on_WebBrowser_NavigateComplete(const QString &url) -{ - QSignalBlocker blocker(m_addressEdit); - actionStop->setEnabled(false); - m_addressEdit->setText(url); -} - -//! [3] -void MainWindow::on_actionGo_triggered() -{ - navigate(address()); -} - -//! [2] - -void MainWindow::navigate(const QString &url) -{ - WebBrowser->dynamicCall("Navigate(const QString&)", url); -} - -void MainWindow::on_actionNewWindow_triggered() -{ - MainWindow *window = new MainWindow; - window->show(); - if (m_addressEdit->text().isEmpty()) - return; - window->m_addressEdit->setText(m_addressEdit->text()); - window->actionStop->setEnabled(true); - window->on_actionGo_triggered(); -} - -void MainWindow::on_actionAbout_triggered() -{ - QMessageBox::about(this, tr("About WebBrowser"), - tr("This Example has been created using the ActiveQt integration into Qt Designer.\n" - "It demonstrates the use of QAxWidget to embed the Internet Explorer ActiveX\n" - "control into a Qt application.")); -} - -void MainWindow::on_actionAboutQt_triggered() -{ - QMessageBox::aboutQt(this, tr("About Qt")); -} - -void MainWindow::on_actionFileClose_triggered() -{ - close(); -} - -#include "main.moc" - -//! [3] //! [4] -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - QCoreApplication::setApplicationVersion(QT_VERSION_STR); - QCoreApplication::setApplicationName(QStringLiteral("Active Qt Web Browser")); - QCoreApplication::setOrganizationName(QStringLiteral("QtProject")); - MainWindow w; - const auto &arguments = QCoreApplication::arguments(); - const QString url = arguments.value(1, QString::fromLatin1(qtUrl)); - w.navigate(url); - w.show(); - return a.exec(); -} -//! [4] diff --git a/examples/activeqt/webbrowser/mainwindow.ui b/examples/activeqt/webbrowser/mainwindow.ui deleted file mode 100644 index 4f5877d..0000000 --- a/examples/activeqt/webbrowser/mainwindow.ui +++ /dev/null @@ -1,290 +0,0 @@ -<ui version="4.0" stdsetdef="1" > - <class>MainWindow</class> - <widget class="QMainWindow" name="MainWindow" > - <property name="objectName" > - <string notr="true" >MainWindow</string> - </property> - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>812</width> - <height>605</height> - </rect> - </property> - <property name="windowTitle" > - <string>Qt WebBrowser</string> - </property> - <widget class="QWidget" name="centralWidget"> - <layout class="QHBoxLayout" > - <property name="objectName" > - <string notr="true" >unnamed</string> - </property> - <property name="margin" > - <number>0</number> - </property> - <property name="spacing" > - <number>6</number> - </property> - <item> - <widget class="QFrame" name="Frame3" > - <property name="objectName" > - <string notr="true" >Frame3</string> - </property> - <property name="frameShape" > - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Sunken</enum> - </property> - <layout class="QVBoxLayout" > - <property name="objectName" > - <string notr="true" >unnamed</string> - </property> - <property name="margin" > - <number>1</number> - </property> - <property name="spacing" > - <number>0</number> - </property> - <item> - <widget class="WebAxWidget" name="WebBrowser" > - <property name="objectName" > - <string notr="true" >WebBrowser</string> - </property> - <property name="focusPolicy" > - <enum>Qt::StrongFocus</enum> - </property> - <property name="control" > - <string>{8856F961-340A-11D0-A96B-00C04FD705A2}</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - <widget class="QToolBar" name="tbNavigate" > - <property name="objectName" > - <string notr="true" >tbNavigate</string> - </property> - <property name="windowTitle" > - <string>Navigation</string> - </property> - <addaction name="actionBack" /> - <addaction name="actionForward" /> - <addaction name="actionStop" /> - <addaction name="actionRefresh" /> - <addaction name="actionHome" /> - <addaction name="separator" /> - <addaction name="actionSearch" /> - </widget> - <widget class="QToolBar" name="tbAddress" > - <property name="objectName" > - <string notr="true" >tbAddress</string> - </property> - <property name="windowTitle" > - <string>Address</string> - </property> - <addaction name="actionGo" /> - </widget> - <widget class="QMenuBar" name="menubar" > - <property name="objectName" > - <string notr="true" >menubar</string> - </property> - <widget class="QMenu" name="PopupMenu" > - <property name="objectName" > - <string notr="true" >PopupMenu</string> - </property> - <property name="title" > - <string>&File</string> - </property> - <widget class="QMenu" name="FileNewGroup_2" > - <property name="objectName" > - <string notr="true" >FileNewGroup_2</string> - </property> - <property name="title" > - <string>New</string> - </property> - <addaction name="actionNewWindow" /> - </widget> - <addaction name="FileNewGroup" /> - <addaction name="FileNewGroup_2" /> - <addaction name="separator" /> - <addaction name="actionFileClose" /> - </widget> - <widget class="QMenu" name="BookmarksMenu" > - <property name="objectName" > - <string notr="true" >BookmarksMenu</string> - </property> - <property name="title" > - <string>&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&story</string> - </property> - </widget> - <widget class="QMenu" name="unnamed" > - <property name="objectName" > - <string notr="true" >unnamed</string> - </property> - <property name="title" > - <string>&Help</string> - </property> - <addaction name="actionAbout" /> - <addaction name="actionAboutQt" /> - </widget> - <addaction name="PopupMenu" /> - <addaction name="BookmarksMenu" /> - <addaction name="HistoryMenu" /> - <addaction name="unnamed" /> - </widget> - <action name="actionGo" > - <property name="objectName" > - <string>actionGo</string> - </property> - <property name="icon" > - <iconset>:/images/go.png</iconset> - </property> - <property name="iconText" > - <string>Go</string> - </property> - </action> - <action name="actionBack" > - <property name="objectName" > - <string>actionBack</string> - </property> - <property name="icon" > - <iconset>:/images/back.png</iconset> - </property> - <property name="iconText" > - <string>Back</string> - </property> - <property name="shortcut" > - <string>Backspace</string> - </property> - </action> - <action name="actionForward" > - <property name="objectName" > - <string>actionForward</string> - </property> - <property name="icon" > - <iconset>:/images/forward.png</iconset> - </property> - <property name="iconText" > - <string>Forward</string> - </property> - </action> - <action name="actionStop" > - <property name="objectName" > - <string>actionStop</string> - </property> - <property name="icon" > - <iconset>:/images/stop.png</iconset> - </property> - <property name="iconText" > - <string>Stop</string> - </property> - </action> - <action name="actionRefresh" > - <property name="objectName" > - <string>actionRefresh</string> - </property> - <property name="icon" > - <iconset>:/images/refresh.png</iconset> - </property> - <property name="iconText" > - <string>Refresh</string> - </property> - </action> - <action name="actionHome" > - <property name="objectName" > - <string>actionHome</string> - </property> - <property name="icon" > - <iconset>:/images/home.png</iconset> - </property> - <property name="iconText" > - <string>Home</string> - </property> - </action> - <action name="actionFileClose" > - <property name="objectName" > - <string>actionFileClose</string> - </property> - <property name="iconText" > - <string>Close</string> - </property> - <property name="text" > - <string>C&lose</string> - </property> - </action> - <action name="actionSearch" > - <property name="objectName" > - <string>actionSearch</string> - </property> - <property name="icon" > - <iconset>:/images/search.png</iconset> - </property> - <property name="iconText" > - <string>Search</string> - </property> - </action> - <action name="actionAbout" > - <property name="objectName" > - <string>actionAbout</string> - </property> - <property name="iconText" > - <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> - </property> - <property name="iconText" > - <string>About Qt</string> - </property> - </action> - <actiongroup name="FileNewGroup" > - <action name="actionNewWindow" > - <property name="objectName" > - <string>actionNewWindow</string> - </property> - <property name="iconText" > - <string>Window</string> - </property> - <property name="shortcut" > - <string>Ctrl+N</string> - </property> - </action> - <property name="objectName" > - <string>FileNewGroup</string> - </property> - </actiongroup> - </widget> - <customwidgets> - <customwidget> - <class>WebAxWidget</class> - <extends>QAxWidget</extends> - <header>webaxwidget.h</header> - </customwidget> - </customwidgets> - <layoutdefault spacing="6" margin="11" /> -</ui> diff --git a/examples/activeqt/webbrowser/webbrowser.qrc b/examples/activeqt/webbrowser/webbrowser.qrc deleted file mode 100644 index 4f463e2..0000000 --- a/examples/activeqt/webbrowser/webbrowser.qrc +++ /dev/null @@ -1,11 +0,0 @@ -<RCC> -<qresource> - <file>images/back.png</file> - <file>images/forward.png</file> - <file>images/go.png</file> - <file>images/home.png</file> - <file>images/refresh.png</file> - <file>images/search.png</file> - <file>images/stop.png</file> -</qresource> -</RCC> |