组态软件–控件导入
个人最近也是在用Qt做组态软件,一开始用QGraphics来做组态软件的UI设计程序,说真的,说真的做出来还有点像样子,但是后续的二次开发存在很大的问题,所以第二次是参考了feiyangqingyun大神的属性设计的思路来做的,可以说做的挺顺利的大概10天就完成了大部分的工作。
首先展示一下做出来的效果
实现功能
控件的加载
相关说明
这部分的代码完全是抄袭的feiyangqingyun大神控件加载的程序,不要问为什么,因为这个代码是真的强大,我是提出不了任何的问题,但是这部分代码可能不符合我写程序的习惯,我一般喜欢吧一个功能直接写到一个QObject的一个类里,这样调用功能的时候只要用指针绑定一下对应类型的控件即可实现该功能,所以有一小点的不同
程序
//pluginInsert.h
#ifndef PLUGININSERT_H
#define PLUGININSERT_H
/*******
* 功能------绑定一个listwidget,并实现控件库的加载
* 最重要的函数 pluginInsert,使用该功能必须调用,建议使用第二个构造函数
* 最重要的参数listWidgets、listNames控件列表和名称列表的参数,可用于后续控件的生成
******/
#include <QObject>
#include <QListWidget>
#include <QtDesigner/QDesignerCustomWidgetInterface>
#include <QStringList>
#include <QPluginLoader>
#include <QtDesigner/QDesignerCustomWidgetCollectionInterface>
class pluginInsert :public QObject //导入UI插件所用,绑定一个listwidget,默认导入quc的控件组的插件
{
Q_OBJECT
public:
pluginInsert(QObject *parent = nullptr);
pluginInsert(QListWidget **widget,QObject *parent = nullptr);
void setlistwidget(QListWidget **widget);
QList<QDesignerCustomWidgetInterface *> listWidgets; //控件列表参数1
QStringList listNames; //控件列表参数2
private:
void initPlugin();
void loadPlugin(const QString &fileName);
void openPlugin(const QString &fileName);
QListWidget *listwidget;
};
#endif // PLUGININSERT_H
#include "plugininsert.h"
#include <QApplication>
pluginInsert::pluginInsert(QObject *parent)
:QObject(parent)
{
listwidget=nullptr;
}
pluginInsert::pluginInsert(QListWidget **widget, QObject *parent)
:QObject(parent)
{
setlistwidget(widget);
}
void pluginInsert::setlistwidget(QListWidget **widget)
{
listwidget=*widget;
initPlugin();
}
void pluginInsert::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()
}
void pluginInsert::loadPlugin(const QString &fileName)
{
openPlugin(fileName);
// this->setWindowTitle(QString("自定义控件属性设计器(共 %1 个控件)
}
void pluginInsert::openPlugin(const QString &fileName)
{
qDeleteAll(listWidgets);
listWidgets.clear();
listNames.clear();
listwidget->clear();
//加载自定义控件插件集合信息,包括获得类名+图标
QPluginLoader loader(fileName);
if (loader.load()) {
QObject *plugin = loader.instance();
//获取插件容器,然后逐个遍历容器找出单个插件
QDesignerCustomWidgetCollectionInterface *interfaces = qobject_cast<QDesignerCustomWidgetCollectionInterface *>(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(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;
}
}
}
这部分程序是完整版的,listwidget绑定了一个控件后即可实现控件导入的功能。但是前提是必须要在编译的exe路径下由quc.dll和libquc.lib两个文件,要不然显示的还是空白的。
参考的博客
https://qtchina.blog.csdn.net/article/details/100652152