您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(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ǔ)的東西更多,可以干的事情更多。
自動(dòng)加載插件文件中的所有控件生成列表,默認(rèn)自帶的控件超過(guò)120個(gè)。
拖曳到畫(huà)布自動(dòng)生成對(duì)應(yīng)的控件,所見(jiàn)即所得。
右側(cè)中文屬性欄,改變對(duì)應(yīng)的屬性立即應(yīng)用到對(duì)應(yīng)選中控件,直觀簡(jiǎn)潔,非常適合小白使用。
獨(dú)創(chuàng)屬性欄文字翻譯映射機(jī)制,效率極高,可以非常方便拓展其他語(yǔ)言的屬性欄。
所有控件的屬性自動(dòng)提取并顯示在右側(cè)屬性欄,包括枚舉值下拉框等。
支持手動(dòng)選擇插件文件,外部導(dǎo)入插件文件。
可以將當(dāng)前畫(huà)布的所有控件配置信息導(dǎo)出到xml文件。
可以手動(dòng)選擇xml文件打開(kāi)控件布局,自動(dòng)根據(jù)xml文件加載控件。
可拉動(dòng)滑動(dòng)條、勾選模擬數(shù)據(jù)復(fù)選框、文本框輸入,三種方式來(lái)生成數(shù)據(jù)應(yīng)用所有控件。
控件支持八個(gè)方位拉動(dòng)調(diào)整大小,自適應(yīng)任意分辨率,可鍵盤(pán)上下左右微調(diào)位置。
打通了串口采集、網(wǎng)絡(luò)采集、數(shù)據(jù)庫(kù)采集三種方式設(shè)置數(shù)據(jù)。
代碼極其精簡(jiǎn),注釋非常詳細(xì),可以作為組態(tài)的雛形,自行拓展更多的功能。
純Qt編寫(xiě),支持任意Qt版本+任意編譯器+任意系統(tǒng)。
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ò),可以把它分享出去讓更多的人看到吧!
免責(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)容。