溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Qt如何導(dǎo)出xml

發(fā)布時(shí)間:2021-12-15 10:20:56 來(lái)源:億速云 閱讀:193 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家分享的是有關(guān)Qt如何導(dǎo)出xml的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

一、前言

能夠?qū)С隹丶季趾蛯傩栽O(shè)置數(shù)據(jù)到xml文件或者其他文件,也是一個(gè)非常實(shí)用的功能,類(lèi)似于QtDesigner中把頁(yè)面設(shè)計(jì)好以后生成的.ui結(jié)尾的文件,其實(shí)就是xml文件,按照約定的規(guī)則存儲(chǔ)好控件名稱和屬性名稱及對(duì)應(yīng)的屬性值,然后打開(kāi)的時(shí)候按照這個(gè)規(guī)則取出來(lái)就行了。每個(gè)控件還有固定的幾個(gè)數(shù)據(jù)需要存儲(chǔ),比如XY軸和對(duì)應(yīng)的寬度高度,然后在xml數(shù)據(jù)文件的最開(kāi)始還可以存儲(chǔ)整個(gè)畫(huà)布的寬度高度以便其他用途。導(dǎo)出到xml格式,是為了方便解析,畢竟xml數(shù)據(jù)格式的解析,各種語(yǔ)言平臺(tái)都有,而且都是非常成熟快速的。其實(shí)還可以考慮存儲(chǔ)到數(shù)據(jù)庫(kù),這樣就更加強(qiáng)大了,能夠存儲(chǔ)的東西更多,可以干的事情更多。

二、實(shí)現(xiàn)的功能

  1. 自動(dòng)加載插件文件中的所有控件生成列表,默認(rèn)自帶的控件超過(guò)120個(gè)。

  2. 拖曳到畫(huà)布自動(dòng)生成對(duì)應(yīng)的控件,所見(jiàn)即所得。

  3. 右側(cè)中文屬性欄,改變對(duì)應(yīng)的屬性立即應(yīng)用到對(duì)應(yīng)選中控件,直觀簡(jiǎn)潔,非常適合小白使用。

  4. 獨(dú)創(chuàng)屬性欄文字翻譯映射機(jī)制,效率極高,可以非常方便拓展其他語(yǔ)言的屬性欄。

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

  6. 支持手動(dòng)選擇插件文件,外部導(dǎo)入插件文件。

  7. 可以將當(dāng)前畫(huà)布的所有控件配置信息導(dǎo)出到xml文件。

  8. 可以手動(dòng)選擇xml文件打開(kāi)控件布局,自動(dòng)根據(jù)xml文件加載控件。

  9. 可拉動(dòng)滑動(dòng)條、勾選模擬數(shù)據(jù)復(fù)選框、文本框輸入,三種方式來(lái)生成數(shù)據(jù)應(yīng)用所有控件。

  10. 控件支持八個(gè)方位拉動(dòng)調(diào)整大小,自適應(yīng)任意分辨率,可鍵盤(pán)上下左右微調(diào)位置。

  11. 打通了串口采集、網(wǎng)絡(luò)采集、數(shù)據(jù)庫(kù)采集三種方式設(shè)置數(shù)據(jù)。

  12. 代碼極其精簡(jiǎn),注釋非常詳細(xì),可以作為組態(tài)的雛形,自行拓展更多的功能。

  13. 純Qt編寫(xiě),支持任意Qt版本+任意編譯器+任意系統(tǒng)。

三、效果圖

Qt如何導(dǎo)出xml

四、核心代碼

void frmMain::saveFile(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text | QFile::Truncate)) {
        return;
    }

    //以流的形式輸出文件
    QTextStream stream(&file);

    //構(gòu)建xml數(shù)據(jù)
    QStringList list;

    //添加固定頭部數(shù)據(jù)
    list << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
    list << QString("<canvas width=\"%1\" height=\"%2\">")
         .arg(ui->centralwidget->width()).arg(ui->centralwidget->height());

    //從容器中找到所有控件,根據(jù)控件的類(lèi)名保存該類(lèi)的所有屬性
    QList<QWidget *> widgets = ui->centralwidget->findChildren<QWidget *>();
    foreach (QWidget *w, widgets) {
        const QMetaObject *metaObject = w->metaObject();
        QString className = metaObject->className();
        QStringList values;

        //如果當(dāng)前控件的父類(lèi)不是主窗體則無(wú)需導(dǎo)出,有些控件有子控件無(wú)需導(dǎo)出
        if (w->parent() != ui->centralwidget || className == "SelectWidget") {
            continue;
        }

        //metaObject->propertyOffset()表示當(dāng)前控件的屬性開(kāi)始索引,0開(kāi)始的是父類(lèi)的屬性
        int index = metaObject->propertyOffset();
        for (int i = index; i < metaObject->propertyCount(); i++) {
            QMetaProperty p = metaObject->property(i);
            QString nodeName = p.name();
            QVariant nodeValue = p.read(w);

            //枚舉值要特殊處理,需要以字符串形式寫(xiě)入,不然存儲(chǔ)到配置文件數(shù)據(jù)為int
            if (p.isEnumType()) {
                QMetaEnum enumValue = p.enumerator();
                nodeValue = enumValue.valueToKey(nodeValue.toInt());
            }

            QString temp = nodeValue.toString().toLocal8Bit().constData();
            values << QString("%1=\"%2\"").arg(nodeName).arg(temp);
            //qDebug() << nodeName << nodeValue;
        }

        //逐個(gè)添加界面上的控件的屬性
        QString str = QString("\t<%1 x=\"%2\" y=\"%3\" width=\"%4\" height=\"%5\" %6/>")
                      .arg(className).arg(w->x()).arg(w->y()).arg(w->width()).arg(w->height()).arg(values.join(" "));
        list << str;
    }

    //添加固定尾部數(shù)據(jù)
    list << "</canvas>";

    //寫(xiě)入文件
    QString data = list.join("\n");
    stream << data;
    file.close();
}

感謝各位的閱讀!關(guān)于“Qt如何導(dǎo)出xml”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI