我有一个小应用程序,用户可以在其中创建自己的插件作为QML文件。这些插件会收到特定事件的通知,它们的用户界面会在TabView中逐一显示。
然而,有些插件需要QML无法提供的功能,比如写入文件。我如何让我的用户能够随心所欲地扩展功能?
您的用户必须:
- 在C++中实现一个提供所需功能的QObject
- 子类
QQmlExtensionPlugin
将该QObject注册为QML类型 - 为#1和#2构建一个DLL(或SO或DYLIB),并编写一个
qmldir
文件来告诉QML引擎如何加载DLL
编辑: Qt Creator会为您自动执行此过程。转到"文件"->"新建文件或项目…"->"项目"->"库"->"Qt Quick 2扩展插件"
您可以在文档中找到有关此过程的更多详细信息:
- 如何编写C++插件:http://qt-project.org/doc/qt-5/qtqml-modules-cppplugins.html
- 插件文件放在哪里,以及如何加载它们:http://qt-project.org/doc/qt-5/qtqml-modules-identifiedmodules.html
注意1:您的用户不会编写*.qml文件。
注意2:每个插件都必须在自己的子文件夹中。这是因为每个C++插件需要一个qmldir
文件,但不能在同一文件夹中有多个qmldir
文件。
你可以在你的Qt安装中找到一些真实的例子。例如,转到C:\Qt\5.3\mingw482_32\qml——这里的所有子文件夹都包含qml插件,这些插件大多是用C++编写的。以下是一些示例源代码:
- BluetoothSocket QML类型的C++代码:http://code.woboq.org/qt5/qtconnectivity/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h.html
- 注册BluetoothSocket类型(以及其他类型)的C++代码:http://code.woboq.org/qt5/qtconnectivity/src/imports/bluetooth/plugin.cpp.html