91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt如何實現加載插件

發布時間:2021-12-15 10:17:04 來源:億速云 閱讀:231 作者:小新 欄目:互聯網科技

這篇文章主要為大家展示了“Qt如何實現加載插件”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Qt如何實現加載插件”這篇文章吧。

一、前言

加載插件是整個屬性設計器的第一步要打通的功能,插件中的控件都加載不了,后面就別搞別玩下去了沒法玩的,要從一個動態庫中加載出來控件,肯定需要用到反射機制,以前做.NET開發的時候就覺得反射這個東西相當強大,居然可以讀取DLL加載出來控件,現在用Qt,發現Qt也有反射機制,也許這東東可能各大開發語言平臺都具備吧,Qt反射對應的類叫QMetaObject,著實強大,其實整個Qt開發框架也是超級強大的,本人自從轉為Qt開發為主后,就深深的愛上了她,在其他跨平臺的GUI開發框架平臺面前,都會被Qt秒成渣,Qt的跨平臺性是毋庸置疑的,幾十兆的內存存儲空間即可運行,尤其是嵌入式linux這種資源相當緊張的情況下,Qt的性能發揮到極致。

二、功能特點

  1. 自動加載插件文件中的所有控件生成列表,默認自帶的控件超過120個。

  2. 拖曳到畫布自動生成對應的控件,所見即所得。

  3. 右側中文屬性欄,改變對應的屬性立即應用到對應選中控件,直觀簡潔,非常適合小白使用。

  4. 獨創屬性欄文字翻譯映射機制,效率極高,可以非常方便拓展其他語言的屬性欄。

  5. 所有控件的屬性自動提取并顯示在右側屬性欄,包括枚舉值下拉框等。

  6. 支持手動選擇插件文件,外部導入插件文件。

  7. 可以將當前畫布的所有控件配置信息導出到xml文件。

  8. 可以手動選擇xml文件打開控件布局,自動根據xml文件加載控件。

  9. 可拉動滑動條、勾選模擬數據復選框、文本框輸入,三種方式來生成數據應用所有控件。

  10. 控件支持八個方位拉動調整大小,自適應任意分辨率,可鍵盤上下左右微調位置。

  11. 打通了串口采集、網絡采集、數據庫采集三種方式設置數據。

  12. 代碼極其精簡,注釋非常詳細,可以作為組態的雛形,自行拓展更多的功能。

  13. 純Qt編寫,支持任意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如何實現加載插件”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

尤溪县| 台北市| 长沙市| 南京市| 福泉市| 台州市| 筠连县| 新源县| 萨嘎县| 盐津县| 台东县| 泰宁县| 南陵县| 甘泉县| 秀山| 潢川县| 衡阳县| 道真| 嵩明县| 东山县| 沙河市| 洱源县| 绥化市| 小金县| 故城县| 中方县| 宁晋县| 安阳市| 天全县| 肃宁县| 琼海市| 内丘县| 连州市| 旬邑县| 措美县| 凤阳县| 儋州市| 肥城市| 梁山县| 福安市| 登封市|