重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要为大家展示了“Qt如何实现加载插件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Qt如何实现加载插件”这篇文章吧。
创新互联长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为喀什企业提供专业的网站建设、成都网站设计,喀什网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
加载插件是整个属性设计器的第一步要打通的功能,插件中的控件都加载不了,后面就别搞别玩下去了没法玩的,要从一个动态库中加载出来控件,肯定需要用到反射机制,以前做.NET开发的时候就觉得反射这个东西相当强大,居然可以读取DLL加载出来控件,现在用Qt,发现Qt也有反射机制,也许这东东可能各大开发语言平台都具备吧,Qt反射对应的类叫QMetaObject,着实强大,其实整个Qt开发框架也是超级强大的,本人自从转为Qt开发为主后,就深深的爱上了她,在其他跨平台的GUI开发框架平台面前,都会被Qt秒成渣,Qt的跨平台性是毋庸置疑的,几十兆的内存存储空间即可运行,尤其是嵌入式linux这种资源相当紧张的情况下,Qt的性能发挥到极致。
自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个。
拖曳到画布自动生成对应的控件,所见即所得。
右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小白使用。
独创属性栏文字翻译映射机制,效率极高,可以非常方便拓展其他语言的属性栏。
所有控件的属性自动提取并显示在右侧属性栏,包括枚举值下拉框等。
支持手动选择插件文件,外部导入插件文件。
可以将当前画布的所有控件配置信息导出到xml文件。
可以手动选择xml文件打开控件布局,自动根据xml文件加载控件。
可拉动滑动条、勾选模拟数据复选框、文本框输入,三种方式来生成数据应用所有控件。
控件支持八个方位拉动调整大小,自适应任意分辨率,可键盘上下左右微调位置。
打通了串口采集、网络采集、数据库采集三种方式设置数据。
代码极其精简,注释非常详细,可以作为组态的雏形,自行拓展更多的功能。
纯Qt编写,支持任意Qt版本+任意编译器+任意系统。
void frmMain::initPlugin() { //载入默认的插件 #if defined(Q_OS_WIN) QString pluginName = QString("%1/quc.dll").arg(qApp->applicationDirPath()); #elif defined(Q_OS_UNIX) QString pluginName = QString("%1/libquc.so").arg(qApp->applicationDirPath()); #elif defined(Q_OS_MAC) QString pluginName = QString("%1/libquc.dylib").arg(qApp->applicationDirPath()); #endif loadPlugin(pluginName); //载入默认的控件xml数据 openFile(qApp->applicationDirPath() + "/quc.xml"); qApp->processEvents(); ui->listWidget->verticalScrollBar()->setValue(0); } void frmMain::loadPlugin(const QString &fileName) { openPlugin(fileName); this->setWindowTitle(QString("自定义控件属性设计器(共 %1 个控件)(QQ:517216493)").arg(ui->listWidget->count())); } void frmMain::openPlugin(const QString &fileName) { qDeleteAll(listWidgets); listWidgets.clear(); listNames.clear(); ui->listWidget->clear(); //加载自定义控件插件集合信息,包括获得类名+图标 QPluginLoader loader(fileName); if (loader.load()) { QObject *plugin = loader.instance(); //获取插件容器,然后逐个遍历容器找出单个插件 QDesignerCustomWidgetCollectionInterface *interfaces = qobject_cast(plugin); if (interfaces) { listWidgets = interfaces->customWidgets(); int count = listWidgets.count(); for (int i = 0; i < count; i++) { QIcon icon = listWidgets.at(i)->icon(); QString className = listWidgets.at(i)->name(); QListWidgetItem *item = new QListWidgetItem(ui->listWidget); item->setText(className); item->setIcon(icon); listNames << className; } } //获取所有插件的类名 const QObjectList objList = plugin->children(); foreach (QObject *obj, objList) { QString className = obj->metaObject()->className(); //qDebug() << className; } } }
以上是“Qt如何实现加载插件”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!