以下是一个示例代码,可以实现将上述XML字符串显示为QTreeWidget,并在双击节点时获取该节点的Desc和Name属性值:
#include <QtWidgets>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建XML文档
QString xmlStr = "<MyItem>\n"
" <Package Head=\"check\" Desc=\"\" Name=\"接收数据\" Id=\"9\">\n"
" <Field Desc=\"经度\" Value=\"118.244\" Type=\"Float\" Name=\"经度\"/>\n"
" </Package>\n"
"</MyItem>";
QDomDocument doc;
if (!doc.setContent(xmlStr)) {
qDebug() << "Failed to parse XML.";
return -1;
}
// 创建QTreeWidget并显示XML内容
QTreeWidget treeWidget;
QDomElement root = doc.documentElement();
treeWidget.setHeaderLabels(QStringList() << root.tagName());
displayXmlNode(&treeWidget, root, nullptr);
// 连接treewidgetitem的双击信号
QObject::connect(&treeWidget, &QTreeWidget::itemDoubleClicked, [&](QTreeWidgetItem *item, int) {
QDomElement elem = item->data(0, Qt::UserRole).value<QDomElement>();
QString name = elem.attribute("Name");
QString desc = elem.attribute("Desc");
qDebug() << "Name:" << name << ", Desc:" << desc;
});
// 显示窗口
treeWidget.show();
return app.exec();
}
void displayXmlNode(QTreeWidget *treeWidget, const QDomNode &node, QTreeWidgetItem *parentItem)
{
QTreeWidgetItem *item = new QTreeWidgetItem(parentItem);
item->setText(0, node.nodeName());
item->setData(0, Qt::UserRole, QVariant::fromValue(node.toElement()));
// 处理节点的属性
QDomNamedNodeMap attrs = node.attributes();
for (int i = 0; i < attrs.count(); ++i) {
QDomNode attrNode = attrs.item(i);
QTreeWidgetItem *attrItem = new QTreeWidgetItem(item);
attrItem->setText(0, QString("%1=%2").arg(attrNode.nodeName()).arg(attrNode.nodeValue()));
}
// 处理子节点
for (QDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling()) {
displayXmlNode(treeWidget, child, item);
}
}
运行程序,可以看到如下效果:
双击Package节点,控制台会输出该节点的Name和Desc属性值:
Name: 接收数据 , Desc: