中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

定远县| 文山县| 湖北省| 普陀区| 吐鲁番市| 会泽县| 林芝县| 勐海县| 青冈县| 安义县| 新蔡县| 太仆寺旗| 色达县| 青河县| 甘德县| 贵南县| 商南县| 北辰区| 明光市| 即墨市| 栾城县| 凭祥市| 农安县| 宁远县| 丘北县| 固阳县| 禹城市| 嵩明县| 微博| 颍上县| 海宁市| 武邑县| 东莞市| 双鸭山市| 五原县| 昌图县| 扎赉特旗| 台东市| 崇明县| 泰安市| 泰兴市|