diff options
Diffstat (limited to 'examples/scriptableapplication')
-rw-r--r-- | examples/scriptableapplication/CMakeLists.txt | 29 | ||||
-rw-r--r-- | examples/scriptableapplication/doc/scriptableapplication.rst | 6 | ||||
-rw-r--r-- | examples/scriptableapplication/mainwindow.cpp | 60 | ||||
-rw-r--r-- | examples/scriptableapplication/mainwindow.h | 6 | ||||
-rw-r--r-- | examples/scriptableapplication/pythonutils.cpp | 10 | ||||
-rw-r--r-- | examples/scriptableapplication/pythonutils.h | 4 |
6 files changed, 68 insertions, 47 deletions
diff --git a/examples/scriptableapplication/CMakeLists.txt b/examples/scriptableapplication/CMakeLists.txt index b1a9ca078..fbfa00b98 100644 --- a/examples/scriptableapplication/CMakeLists.txt +++ b/examples/scriptableapplication/CMakeLists.txt @@ -1,5 +1,8 @@ -cmake_minimum_required(VERSION 3.16) -cmake_policy(VERSION 3.16) +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.18) +cmake_policy(VERSION 3.18) # Enable policy to run automoc on generated files. if(POLICY CMP0071) @@ -12,13 +15,25 @@ project(scriptableapplication) set(CMAKE_CXX_STANDARD 17) # Find required Qt packages. -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) +find_package(Qt6 COMPONENTS Core Gui Widgets) # Use provided python interpreter if given. if(NOT python_interpreter) - find_program(python_interpreter NAMES python3 python) + if(WIN32 AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + find_program(python_interpreter "python_d") + if(NOT python_interpreter) + message(FATAL_ERROR + "A debug Python interpreter could not be found, which is a requirement when " + "building this example in a debug configuration. Make sure python_d.exe is in " + "PATH.") + endif() + else() + find_program(python_interpreter "python") + if(NOT python_interpreter) + message(FATAL_ERROR + "No Python interpreter could be found. Make sure python is in PATH.") + endif() + endif() endif() message(STATUS "Using python interpreter: ${python_interpreter}") @@ -86,7 +101,7 @@ set(WRAPPED_HEADER ${CMAKE_SOURCE_DIR}/wrappedclasses.h) set(TYPESYSTEM_FILE ${CMAKE_SOURCE_DIR}/scriptableapplication.xml) set(SHIBOKEN_OPTIONS --generator-set=shiboken --enable-parent-ctor-heuristic - --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero + --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb-bool --avoid-protected-hack ${INCLUDES} -I${CMAKE_SOURCE_DIR} diff --git a/examples/scriptableapplication/doc/scriptableapplication.rst b/examples/scriptableapplication/doc/scriptableapplication.rst index b00d65415..146911f13 100644 --- a/examples/scriptableapplication/doc/scriptableapplication.rst +++ b/examples/scriptableapplication/doc/scriptableapplication.rst @@ -84,7 +84,7 @@ On Windows: mkdir build cd build - cmake -H.. -B. -G Ninja -DCMAKE_BUILD_TYPE=Release + cmake -S.. -B. -G Ninja -DCMAKE_BUILD_TYPE=Release ninja ./scriptableapplication @@ -127,13 +127,13 @@ passing the compiler on the command line: .. code-block:: bash - cmake -H.. -B. -DCMAKE_C_COMPILER=cl.exe -DCMAKE_CXX_COMPILER=cl.exe + cmake -S.. -B. -DCMAKE_C_COMPILER=cl.exe -DCMAKE_CXX_COMPILER=cl.exe or using the -G option: .. code-block:: bash - cmake -H.. -B. -G "Visual Studio 14 Win64" -DCMAKE_BUILD_TYPE=Release + cmake -S.. -B. -G "Visual Studio 14 Win64" -DCMAKE_BUILD_TYPE=Release If the ``-G "Visual Studio 14 Win64"`` option is used, a ``sln`` file diff --git a/examples/scriptableapplication/mainwindow.cpp b/examples/scriptableapplication/mainwindow.cpp index 27e6f1247..ece7989e7 100644 --- a/examples/scriptableapplication/mainwindow.cpp +++ b/examples/scriptableapplication/mainwindow.cpp @@ -19,37 +19,44 @@ #include <QtCore/QDebug> #include <QtCore/QTextStream> -static const char defaultScript[] = R"( -import AppLib +using namespace Qt::StringLiterals; + +static const auto defaultScript = R"(import AppLib print("Hello, world") mainWindow.testFunction1() -)"; +)"_L1; MainWindow::MainWindow() - : m_scriptEdit(new QPlainTextEdit(QString::fromLatin1(defaultScript).trimmed(), this)) + : m_scriptEdit(new QPlainTextEdit(defaultScript, this)) { setWindowTitle(tr("Scriptable Application")); - QMenu *fileMenu = menuBar()->addMenu(tr("&File")); - const QIcon runIcon = QIcon::fromTheme(QStringLiteral("system-run")); - QAction *runAction = fileMenu->addAction(runIcon, tr("&Run..."), this, &MainWindow::slotRunScript); + auto *fileMenu = menuBar()->addMenu(tr("&File")); + const QIcon runIcon = QIcon::fromTheme("system-run"_L1); + auto *runAction = fileMenu->addAction(runIcon, tr("&Run..."), + this, &MainWindow::slotRunScript); runAction->setShortcut(Qt::CTRL | Qt::Key_R); - QAction *diagnosticAction = fileMenu->addAction(tr("&Print Diagnostics"), this, &MainWindow::slotPrintDiagnostics); + auto *diagnosticAction = fileMenu->addAction(tr("&Print Diagnostics"), + this, &MainWindow::slotPrintDiagnostics); diagnosticAction->setShortcut(Qt::CTRL | Qt::Key_D); - fileMenu->addAction(tr("&Invoke testFunction1()"), this, &MainWindow::testFunction1); - const QIcon quitIcon = QIcon::fromTheme(QStringLiteral("application-exit")); - QAction *quitAction = fileMenu->addAction(quitIcon, tr("&Quit"), qApp, &QCoreApplication::quit); + fileMenu->addAction(tr("&Invoke testFunction1()"), + this, &MainWindow::testFunction1); + const QIcon quitIcon = QIcon::fromTheme(QIcon::ThemeIcon::ApplicationExit); + auto *quitAction = fileMenu->addAction(quitIcon, tr("&Quit"), + qApp, &QCoreApplication::quit); quitAction->setShortcut(Qt::CTRL | Qt::Key_Q); - QMenu *editMenu = menuBar()->addMenu(tr("&Edit")); - const QIcon clearIcon = QIcon::fromTheme(QStringLiteral("edit-clear")); - QAction *clearAction = editMenu->addAction(clearIcon, tr("&Clear"), m_scriptEdit, &QPlainTextEdit::clear); + auto *editMenu = menuBar()->addMenu(tr("&Edit")); + const QIcon clearIcon = QIcon::fromTheme(QIcon::ThemeIcon::EditClear); + auto *clearAction = editMenu->addAction(clearIcon, tr("&Clear"), + m_scriptEdit, &QPlainTextEdit::clear); - QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); - const QIcon aboutIcon = QIcon::fromTheme(QStringLiteral("help-about")); - QAction *aboutAction = helpMenu->addAction(aboutIcon, tr("&About Qt"), qApp, &QApplication::aboutQt); + auto *helpMenu = menuBar()->addMenu(tr("&Help")); + const QIcon aboutIcon = QIcon::fromTheme(QIcon::ThemeIcon::HelpAbout); + auto *aboutAction = helpMenu->addAction(aboutIcon, tr("&About Qt"), + qApp, &QApplication::aboutQt); - QToolBar *toolBar = new QToolBar; + auto *toolBar = new QToolBar; addToolBar(toolBar); toolBar->addAction(quitAction); toolBar->addSeparator(); @@ -62,26 +69,29 @@ MainWindow::MainWindow() m_scriptEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); setCentralWidget(m_scriptEdit); - if (!PythonUtils::bindAppObject("__main__", "mainWindow", PythonUtils::MainWindowType, this)) + if (!PythonUtils::bindAppObject("__main__"_L1, "mainWindow"_L1, + PythonUtils::MainWindowType, this)) { statusBar()->showMessage(tr("Error loading the application module")); + } } void MainWindow::slotRunScript() { const QString text = m_scriptEdit->toPlainText().trimmed(); - const QStringList script = text.split(u'\n', Qt::SkipEmptyParts); - if (!script.isEmpty()) - runScript(script); + if (!text.isEmpty()) + runScript(text); } void MainWindow::slotPrintDiagnostics() { - const QStringList script = QStringList() - << "import sys" << "print('Path=', sys.path)" << "print('Executable=', sys.executable)"; + const QString script = R"P(import sys +print('Path=', sys.path) +print('Executable=', sys.executable) +)P"_L1; runScript(script); } -void MainWindow::runScript(const QStringList &script) +void MainWindow::runScript(const QString &script) { if (!::PythonUtils::runScript(script)) statusBar()->showMessage(tr("Error running script")); diff --git a/examples/scriptableapplication/mainwindow.h b/examples/scriptableapplication/mainwindow.h index b7cafc3e6..e72f5ca72 100644 --- a/examples/scriptableapplication/mainwindow.h +++ b/examples/scriptableapplication/mainwindow.h @@ -6,7 +6,7 @@ #include <QtWidgets/QMainWindow> -class QPlainTextEdit; +QT_FORWARD_DECLARE_CLASS(QPlainTextEdit) class MainWindow : public QMainWindow { @@ -16,12 +16,14 @@ public: void testFunction1(); + static constexpr auto TEST = QLatin1StringView("test"); + private Q_SLOTS: void slotRunScript(); void slotPrintDiagnostics(); private: - void runScript(const QStringList &); + void runScript(const QString &); QPlainTextEdit *m_scriptEdit; }; diff --git a/examples/scriptableapplication/pythonutils.cpp b/examples/scriptableapplication/pythonutils.cpp index b167bb240..8104bb167 100644 --- a/examples/scriptableapplication/pythonutils.cpp +++ b/examples/scriptableapplication/pythonutils.cpp @@ -114,20 +114,14 @@ bool bindAppObject(const QString &moduleName, const QString &name, return true; } -bool runScript(const QStringList &script) +bool runScript(const QString &script) { if (init() == PythonUninitialized) return false; - // Concatenating all the lines - QString content; - QTextStream ss(&content); - for (const QString &line: script) - ss << line << "\n"; - // Executing the whole script as one line bool result = true; - const QByteArray line = content.toUtf8(); + const QByteArray line = script.toUtf8(); if (PyRun_SimpleString(line.constData()) == -1) { if (PyErr_Occurred()) PyErr_Print(); diff --git a/examples/scriptableapplication/pythonutils.h b/examples/scriptableapplication/pythonutils.h index 80698d234..09e959159 100644 --- a/examples/scriptableapplication/pythonutils.h +++ b/examples/scriptableapplication/pythonutils.h @@ -6,7 +6,7 @@ #include <QtCore/QStringList> -class QObject; +QT_FORWARD_DECLARE_CLASS(QObject) namespace PythonUtils { @@ -27,7 +27,7 @@ State init(); bool bindAppObject(const QString &moduleName, const QString &name, int index, QObject *o); -bool runScript(const QStringList &script); +bool runScript(const QString &script); } // namespace PythonUtils |