From 8a87fad08354a1ff0fddef28296e5c3e1803a998 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 12 Jan 2016 13:32:19 +0100 Subject: Add a simple manual test for loading Active X controls. Add a simple Ax Viewer console application that can be passed a CLSID on the command line with options to dump the widget/ window hierarchies using diaglib. Debugging it is easier than debugging testcon, which is also a server that cannot be built as console application. Task-number: QTBUG-50206 Change-Id: I0c267fad3421ed05764ce36fb2cc0b1bcca22b75 Reviewed-by: Joerg Bornemann --- tests/manual/axviewer/axviewer.pro | 6 ++ tests/manual/axviewer/main.cpp | 171 +++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 tests/manual/axviewer/axviewer.pro create mode 100644 tests/manual/axviewer/main.cpp (limited to 'tests') diff --git a/tests/manual/axviewer/axviewer.pro b/tests/manual/axviewer/axviewer.pro new file mode 100644 index 0000000..2c06290 --- /dev/null +++ b/tests/manual/axviewer/axviewer.pro @@ -0,0 +1,6 @@ +TEMPLATE = app +QT = core gui widgets axcontainer +CONFIG += console c++11 +SOURCES += main.cpp +DIAGLIB = ../../../../qtbase/tests/manual/diaglib +exists($$DIAGLIB):include($$DIAGLIB/diaglib.pri) diff --git a/tests/manual/axviewer/main.cpp b/tests/manual/axviewer/main.cpp new file mode 100644 index 0000000..34e6aa6 --- /dev/null +++ b/tests/manual/axviewer/main.cpp @@ -0,0 +1,171 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef QT_DIAG_LIB +# include +# include +# include +#endif + +#include +#include + +QT_USE_NAMESPACE + +static inline bool isOptionSet(int argc, char *argv[], const char *option) +{ + return (argv + argc) != + std::find_if(argv + 1, argv + argc, + [option] (const char *arg) { return !qstrcmp(arg, option); }); +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(); + bool setControl(const QString &clsid); + +private: + QAxWidget *m_axWidget; +}; + +MainWindow::MainWindow() + : m_axWidget(new QAxWidget) +{ + const QString title = QGuiApplication::applicationDisplayName() + QLatin1String(" Qt ") + + QLatin1String(QT_VERSION_STR) + QLatin1String(", ") + + QString::number(QSysInfo::WordSize) + QLatin1String("bit"); + setWindowTitle(title); + + setObjectName(QLatin1String("MainWindow")); + m_axWidget->setObjectName(QLatin1String("AxWidget")); + + setCentralWidget(m_axWidget); + + QMenu *fileMenu = menuBar()->addMenu(QLatin1String("File")); + fileMenu->setObjectName(QLatin1String("FileMenu")); + QToolBar *toolbar = new QToolBar; + toolbar->setObjectName(QLatin1String("ToolBar")); + addToolBar(Qt::TopToolBarArea, toolbar); + + QAction *action; +#ifdef QT_DIAG_LIB + action = fileMenu->addAction("Dump Widgets", + this, [] () { QtDiag::dumpAllWidgets(); }); + toolbar->addAction(action); + action = fileMenu->addAction("Dump Windows", + this, [] () { QtDiag::dumpAllWindows(); }); + toolbar->addAction(action); + action = fileMenu->addAction("Dump Native Windows", + this, [this] () { QtDiag::dumpNativeWindows(winId()); }); + toolbar->addAction(action); + fileMenu->addSeparator(); +#endif // QT_DIAG_LIB + action = fileMenu->addAction("Quit", qApp, &QCoreApplication::quit); + toolbar->addAction(action); + action->setShortcut(Qt::CTRL + Qt::Key_Q); +} + +bool MainWindow::setControl(const QString &clsid) +{ + const bool result = m_axWidget->setControl(clsid); + if (result) + statusBar()->showMessage(QLatin1String("Loaded ") + clsid); + return result; +} + +int main(int argc, char* argv[]) +{ + if (isOptionSet(argc, argv, "-s")) + QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); + if (!isOptionSet(argc, argv, "-n")) + QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); + + QApplication app(argc, argv); + QCoreApplication::setApplicationVersion(QLatin1String(QT_VERSION_STR)); + QGuiApplication::setApplicationName("Ax Viewer"); + + QCommandLineParser parser; + parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); + parser.addHelpOption(); + parser.addVersionOption(); + QCommandLineOption noScalingDummy(QStringLiteral("s"), + QStringLiteral("Set Qt::AA_DisableHighDpiScaling.")); + parser.addOption(noScalingDummy); + QCommandLineOption nativeSiblingsDummy(QStringLiteral("n"), + QStringLiteral("Do not set Qt::AA_DontCreateNativeWidgetSiblings.")); + parser.addOption(nativeSiblingsDummy); + parser.addPositionalArgument(QStringLiteral("[clsid]"), QStringLiteral("Class ID")); + + parser.process(QCoreApplication::arguments()); + + QString clsid = parser.positionalArguments().value(0, QString()); + if (clsid.isEmpty()) { + QAxSelect select; + if (select.exec() != QDialog::Accepted) + return 0; + clsid = select.clsid(); + } + + MainWindow mainWindow; + + qDebug() << QT_VERSION_STR << "Loading" << clsid; + + if (!mainWindow.setControl(clsid)) { + qWarning().noquote().nospace() << "Failed to set \"" << clsid << '"'; + return -1; + } + + mainWindow.show(); + return app.exec(); +} + +#include "main.moc" -- cgit v1.2.1