真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Qt如何導(dǎo)出xml

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

創(chuàng)新互聯(lián)長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為尼瀘西企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,尼瀘西網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

一、前言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  13. 純Qt編寫,支持任意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 << "";
    list << QString("")
         .arg(ui->centralwidget->width()).arg(ui->centralwidget->height());

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

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

        //metaObject->propertyOffset()表示當(dāng)前控件的屬性開始索引,0開始的是父類的屬性
        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);

            //枚舉值要特殊處理,需要以字符串形式寫入,不然存儲到配置文件數(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;
        }

        //逐個添加界面上的控件的屬性
        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 << "";

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

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


文章題目:Qt如何導(dǎo)出xml
鏈接分享:http://weahome.cn/article/pdipgc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部