插件的創建非常簡單,但是它可以復用,並且為不同的應用程序擴展類型。使用創建的插件是非常靈活的
解決方案。關於插件一個很好的例子見QmlBook-In-Chinese 中最后一章介紹的例子。
本文主要備忘生成插件dll,怎么引用。
1.創建插件 ,Library->Qt Quick 2 Extension Plugin
#ifndef MYITEM_H #define MYITEM_H #include <QQuickItem> class MyItem : public QQuickItem { Q_OBJECT Q_DISABLE_COPY(MyItem) public: MyItem(QQuickItem *parent = 0); ~MyItem(); Q_INVOKABLE void read(); }; #endif // MYITEM_H
#include "myitem.h" #include <QDebug> MyItem::MyItem(QQuickItem *parent): QQuickItem(parent) { // By default, QQuickItem does not draw anything. If you subclass // QQuickItem to create a visual item, you will need to uncomment the // following line and re-implement updatePaintNode() // setFlag(ItemHasContents, true); } MyItem::~MyItem() { } void MyItem::read() { qWarning() << "qml cpp plugin "; }
#pragma once #include <QQmlExtensionPlugin> class QMLCPPPluginPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") public: void registerTypes(const char *uri); };
#include "qmlcppplugin_plugin.h" #include "myitem.h" #include <qqml.h> void QMLCPPPluginPlugin::registerTypes(const char *uri) { // @uri com.mycompany.qmlcomponents qmlRegisterType<MyItem>(uri, 1, 0, "MyItem"); }
qmldir 文件
module MyPlugin
plugin QMLCPPPlugin
編譯,生成release和debug QMLCPPPlugin.dll 和 QMLCPPPlugind.dll
2.應用
Application->Qt Quick Application
在應用程序新建文件夾DLL(DLL文件夾和QMLCPPPluginApp.pro同級目錄),在DLL新建文件夾MyPlugin(此MyPlugin是qmldir文件中module).
把QMLCPPPlugin.dll ,QMLCPPPlugind.dll和qmldir復制到MyPlugin文件夾內。(D:\Test1\QMLCPPPluginApp\QMLCPPPluginApp\DLL\MyPlugin)
指定插件DLL的路徑
engine.addImportPath("D:/Test1/QMLCPPPluginApp/QMLCPPPluginApp/DLL/");
如果不指定,在Qt安裝文件D:\ProgramFiles\Qt\Qt580\5.8\mingw53_32\qml目錄新建文件夾MyPlugin,把QMLCPPPlugin.dll ,QMLCPPPlugind.dll和qmldir復制到MyPlugin文件夾內。
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.addImportPath("D:/Test1/QMLCPPPluginApp/QMLCPPPluginApp/DLL/"); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
import QtQuick 2.6 import QtQuick.Window 2.2 import MyPlugin 1.0 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") MainForm { anchors.fill: parent mouseArea.onClicked: { cppPlugin.read() console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"')) } } MyItem{ id:cppPlugin } }