Qt5.6_qml_C++插件
网上搜了不少资料,整理下,还处于学习qml中,用于备忘
工程
- Qt Quick Application - 应用程序(主程序)
使用QtCreater建立Qt Quick Application工程- Qt Quick 2 Extension Plugin - 插件
使用QtCreater建立Qt Quick 2 Extension Plugin 工程
步骤
- 使用QtCreater建立Qt Quick Application工程,main.cpp主内容如下:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
2 使用QtCreater建立Qt Quick 2 Extension Plugin 工程
2.1 填写Custom QML Extension Plugin Parameters 时,使用MyPlugin作为例子:
obJect class-name: MyPlugin
URI: MyPlugin(这里可以短一点,后面需要文件夹与之对应,如果是真的项目则可以长一点)
2.2 可以看到myplugin_plugin.cpp有:
void MyPluginPlugin::registerTypes(const char *uri)
{
// @uri MyPlugin
qmlRegisterType<MyPlugin>(uri, 1, 0, "MyPlugin");
}
"MyPlugin" 这里表明qml写import后使用的 组件名,与obJect class-name类名一致
2.3 加入C++对qml可见的属性,注意要在MyPlugin类里面写,不要在MyPluginPlugin(QT插件需要)
class MyPlugin : public QQuickItem
{
Q_OBJECT
Q_DISABLE_COPY(MyPlugin)
//增加一个strText
Q_PROPERTY(QString strText READ readStrText)
public:
MyPlugin(QQuickItem *parent = 0);
~MyPlugin();
//先简单地返回“hello world”
Q_INVOKABLE QString readStrText() const;
};
QString MyPlugin::readStrText() const
{
return "hello world";
}
2.4 编译
a)分为debug与release编译,请看自己的工程设置,最好都编出来,编后,可以在编译目当下,分别找到MyPlugind.dll与MyPlugin.dll(多了个d表明是debug);PS:如果编译提示无法找到执行档,是没有关系的
b)重要: 查看工程其他文件qmldir
//表明 import XXX 时的名字,需要一个文件夹与之对应
module MyPlugin
plugin MyPlugin
c)建立相关文件夹
module MyPlugin
表明我们新建立的文件夹名字是MyPlugin,将qmldir,MyPlugind.dll与MyPlugin.dll放进此文件夹下
假设新建文件夹路径为 D:/vsProject/QtProject/MyPlugin/
d)生成插件描述文件qmltypes,也可以用于检查C++插件是否有问题
打开 开始》Qt5.6 for Destop(MinGW 4.9.2 32bit) (QT安装后就会有)
命令: qmlplugindump MyPlugin 1.0 D:/vsProject/QtProject/ > D:/vsProject/QtProject/MyPlugin/plugin.qmltypes
注意:面是 D:/vsProject/QtProject/
可以看到plugin.qmltypes有包含下面的内容,与2.3相对应:
Property { name: "strText"; type: "string"; isReadonly: true }
Method { name: "readStrText"; type: "string" }
3 使用Qt的C++插件
回到1建立Qt Quick Application工程,将MyPlugin文件夹放于该工程目录下,添加代码
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
//插件路径
engine.addImportPath("./");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
main.qml:
......
import MyPlugin 1.0
Window
{
visible: true
width: 1000
height: 700
MyPlugin
{
id: myPl
}
Rectangle
{
width: 200
height: 200
border.color: "grey"
Text
{
text: myPl.strText
}
}
}