Создать плагин QML с CMake - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь создать простой плагин QML C ++ с помощью CMake. Вот мои исходники:

CMakeLists.txt :

cmake_minimum_required(VERSION 2.8.12)

project(qmltest LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

# Path to installed Qt 5.15
set(Qt5Core_DIR ".../Qt/5.15.0/gcc_64/lib/cmake/Qt5Core")
set(Qt5Qml_DIR ".../Qt/5.15.0/gcc_64/lib/cmake/Qt5Qml")
set(Qt5Quick_DIR ".../Qt/5.15.0/gcc_64/lib/cmake/Qt5Quick")

find_package(Qt5 COMPONENTS Core Quick Qml REQUIRED)

LINK_DIRECTORIES(.../Qt/5.15.0/gcc_64/lib)
INCLUDE_DIRECTORIES(.../Qt/5.15.0/gcc_64/include)
INCLUDE_DIRECTORIES(.../Qt/5.15.0/gcc_64/include/QtQml)
set(QML_IMPORT_PATH ${CMAKE_CURRENT_BINARY_DIR} CACHE STRING "" FORCE)

add_library(dummy SHARED
  "dummy.h" "dummy.cpp" "myplugin.h" "myplugin.cpp"
)
target_link_libraries(dummy Qt5::Core Qt5::Quick Qt5::Qml)

add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc")

target_link_libraries(${PROJECT_NAME} dummy Qt5::Core Qt5::Quick Qt5::Qml)

main. cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QObject>
#include <QtPlugin>

int main(int argc, char *argv[])
{
  qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

  QGuiApplication app(argc, argv);

  QQmlApplicationEngine engine;
  engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  if (engine.rootObjects().isEmpty())
    return -1;

  return app.exec();
}

dummy.h:

#ifndef DUMMY_H
#define DUMMY_H

#include <QObject>

class Dummy : public QObject
{
  Q_OBJECT
  Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

public:
  explicit Dummy(QObject *parent = nullptr);
  QString name();
  void setName(const QString x);

signals:
  void nameChanged();

public slots:

private:
  QString _name;
};

#endif // DUMMY_H


myplugin.h:

#ifndef MYPLUGIN_H
#define MYPLUGIN_H

#include <QtQml/QQmlEngineExtensionPlugin>
#include <QObject>
#include <QQmlApplicationEngine>
#include <iostream>

#include <dummy.h>

class MyPlugin : public QQmlEngineExtensionPlugin
{
  Q_OBJECT
  Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)

public:
  void registerTypes(const char* uri) {
     std::cout << "GGGGGGGGGGGGGGGG\n";
     qmlRegisterType<Dummy>(uri, 1, 0, "Dummy");
     qmlRegisterModule(uri, 1, 0);
     qmlProtectModule(uri, 1);
  }
};

#endif // MYPLUGIN_H

main.qml:

import MyPlugin 1.0

Window {
    Dummy {}
}

Я также создал каталог в моем каталоге сборки с именем MyPlugin со ссылкой на встроенный файл libdummy.so и qmldir, как показано ниже:

module MyPlugin
plugin dummy

Сборки проекта, но когда я запускаю его, я получаю сообщение об ошибке:

plugin cannot be loaded for module "MyPlugin": Cannot protect module MyPlugin 1 as it was never registered

Мой вывод отладки из функции registerTypes не был вызван (нет вывода на стандартный вывод), поэтому я предполагаю, что типы не были зарегистрированы по некоторым причинам . Если я попытаюсь зарегистрировать тип статически, добавив эту строку в myplugin. cpp:

static int unused = qmlRegisterType<Dummy>("MyPlugin", 1, 0, "Dummy");

, я получаю сообщение об ошибке:

plugin cannot be loaded for module "MyPlugin": Namespace 'MyPlugin' has already been used for type registration

Что мне делать не так в этом плагине и как заставить его работать с CMake?

...