Russian Qt Forum

Qt => Qt Quick => Тема начата: Silver_swift от Марта 03, 2014, 22:52



Название: Qt 5.2.1 не могу создать плагин
Отправлено: Silver_swift от Марта 03, 2014, 22:52
Доброго времени суток!

Столкнулся с неожиданной проблемой при попытке создать плагин.

Сперва попробовал сделать это по образу и подобию Qt4. Создал два класса ProvederPlugin - сам плагин и ProviderItem - пустой класс унаследованный от QObject.

Код:
provideritem.h
Код:
#ifndef PROVIDERPLUGIN_H
#define PROVIDERPLUGIN_H


#include <QObject>
#include <QtQuick>
#include <QQmlExtensionPlugin>

class ProvederPlugin : public QQmlExtensionPlugin
{
    Q_OBJECT
//    Q_PLUGIN_METADATA("ProviderItem" )
public:
    void registerTypes(const char *uri);

};

#endif // PROVIDERPLUGIN_H

Код:
#include "providerplugin.h"
#include "provideritem.h"

void ProvederPlugin::registerTypes(const char *uri){
    qmlRegisterType<ProviderItem>(uri, 1, 0, "ProviderItem");
}


.pro
Код:
TEMPLATE = lib
CONFIG += qt plugin
QT += qml quick

DESTDIR = ../qml
TARGET = provider_plugin

HEADERS += \
    provideritem.h \
    providerplugin.h

SOURCES += \
    provideritem.cpp \
    providerplugin.cpp


В каталоге qml создан qmldir:
Код:
module MyModule
MainView 1.0 mainview.qml
plugin provider_plugin .

При запуске вижу:
Код:
file:///home/<путь к файлу>/qml/qmldir: plugin cannot be loaded for module "qml": Plugin verification data mismatch in '/home/<путь к файлу>/qml/libprovider_plugin.so' 

Если раскомментировать  Q_PLUGIN_METADATA - мок выкинет ошибку. Что это за макрос мне не ясно, также как и что такое IID плагина. Ощущение такое будто я что-то пропустил и не могу найти нужную информацию.

Потом я попробовал запустить пример QML Plugin Example на который есть ссылка в справке. Собрал. При запуске увидел:
Код:
qmlscene -I imports plugins.qml
file:///home/<путь к файлу>/qml/qmlextensionplugins/plugins.qml:41 plugin cannot be loaded for module "TimeExample": The plugin '/home/<путь к файлу>/qml/qmlextensionplugins/imports/TimeExample/libqmlqtimeexampleplugin.so' uses incompatible Qt library. (5.2.1) [release]
и
Код:
qmlscene -I imports plugins.qml
file:///home/<путь к файлу>/qml/qmlextensionplugins/plugins.qml:41 plugin cannot be loaded for module "TimeExample": The plugin '/home/<путь к файлу>/qml/qmlextensionplugins/imports/TimeExample/libqmlqtimeexampleplugin.so' uses incompatible Qt library. (5.2.1) [debug]
в зависимости от параметра сборки.

В общем, коллеги, помогите разобраться, как создать свой плагин.


Название: Re: Qt 5.2.1 не могу создать плагин
Отправлено: Silver_swift от Марта 03, 2014, 23:10
Некоторый прогресс. Прочитал https://bugreports.qt-project.org/browse/QTCREATORBUG-8500 и добавил
Код:
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin")
.
Новая проблема при запуске:
Код:
file:///home/<путь к файлу>qml/qmldir: plugin cannot be loaded for module "qml": Module namespace 'VisualModule' does not match import URI 'qml


Название: Re: Qt 5.2.1 не могу создать плагин
Отправлено: Silver_swift от Марта 03, 2014, 23:14
Мде... наугад заменил в qmldir VisualModule на qml. Плагин вроде бы загрузился. Где бы найти tutorial по созданию плагина с объяснением всех моментов?

Добавлено:
Поспешил радоваться. При использовании в qml:
Код:
 ProviderItem is not a type ProviderItem is not a type 
         ProviderItem{
         ^


Хотя QtCreator все вроде бы распознает и даже автодополнение знает о таком компоненте.


Название: Re: Qt 5.2.1 не могу создать плагин
Отправлено: Silver_swift от Марта 19, 2014, 21:00
Э-хей... Проблему давно решил встраиванием QObject'a как свойства. Но вопрос с подгрузкой плагина в QML остался не решен. Неужели никто не пробовал делать такого в Qt5?


Название: Re: Qt 5.2.1 не могу создать плагин
Отправлено: Mikhail от Марта 19, 2014, 21:44
Посмотри, пример рабочий.

http://pavelk.ru/pishem-rasshirenie-plugin-dlya-qml-qml-grid


Название: Re: Qt 5.2.1 не могу создать плагин
Отправлено: Silver_swift от Марта 19, 2014, 21:49
А если я не хочу устанавливать плагин в каталог с Qt? Например, если надо все файлы программы собрать в одном каталоге.
В Qt4 плагин подцеплялся из любого каталога, указанного в qmldir.