您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Qt如何實現加載插件”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Qt如何實現加載插件”這篇文章吧。
加載插件是整個屬性設計器的第一步要打通的功能,插件中的控件都加載不了,后面就別搞別玩下去了沒法玩的,要從一個動態庫中加載出來控件,肯定需要用到反射機制,以前做.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<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(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如何實現加載插件”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。