更新
void MainWindow::readXml()
{
QDomDocument Champions;
QFile xmlFile("champions.xml");
xmlFile.open(QIODevice::ReadOnly);
Champions.setContent(&xmlFile);
QDomElement root = Champions.firstChildElement();
QDomNodeList ChampionNames = root.elementsByTagName("Champion");
for(int i = 0; i < ChampionNames.count(); i++)
{
QDomNode championNode = ChampionNames.at(i);
if(championNode.isElement())
{
QDomElement Champion = championNode.toElement();
ui->comboBox->addItem(Champion.attribute("Name"));
}}}
管理得到这样的东西所以我现在在comboBox中有名字:)
我是这个社区的新手,所以我很高兴见到你们所有人!
首先,我想通知你,我对Qt编程很新,但是我在学校里有一些基本的c ++课程,虽然它只是控制台编程而且我从来没有做过类似的事情。为什么我开始使用Qt?它看起来很容易,而且它与视觉工作室相比!所以这是我的问题。
Basiclly我有一个comboBox,我会在其中读取我的“Name =”“”属性。将会有大约100个可能的abit更少或许更多的不知道然而。我不知道如何开始这一切,因为我以前从未做过这样的事情。当我在组合框中选择“名称”时,我想要软件做的基本上,我希望所有属性(“Q”“W”“E”“R”)打印在4个标签中,因为你可以看看我添加的小图片。
我不知道是否需要先将文件读入某些字符串数组或数据结构中。我是否需要在XML文件中搜索在ComboBox中选择的“名称”,然后以某种方式将其打印出来?我花了一些时间在这上面,但我找不到一种方法来实现我想要的东西。我真的会特别使用ComboBox来代理一些代码示例,因为我说我是新手。
如果图像模糊,XML文件看起来像这样:
<ROOT>
<Champ Name="XXX1">
<Q>QQ1</Q>
<W>WW1</W>
<E>EE1</E>
<R>RR1</R>
</Champ>
<Champ Name="XXX2">
<Q>QQ2</Q>
<W>WW2</W>
<E>EE2</E>
<R>RR2</R>
</Champ>
</ROOT>
我在描述事情时非常糟糕,所以我用钢笔做了一个小笔,让你更好地理解我:)
感谢您的支持!希望我明白我的问题。祝你有美好的一天。
答案 0 :(得分:1)
首先,您应该将您的XML
数据表示为C ++类/结构:
class Champ {
public:
// A constructor using QDomElement as argument
Champ(QDomElement element);
QString name;
QString q, w, e, r;
};
其次,您应该加载XML文件,解析它,并使用Champ
对象填充向量(或映射)。
QVector<Champ> loadChampsObjects(const QString& xmlPath)
{
QVector<Champ> champObjects;
QFile file(xmlPath);
if (!file->open(QIODevice::ReadOnly | QIODevice::Text))
return champObjects;
/* QDomDocument takes any QIODevice. as well as QString buffer*/
QDomDocument doc("mydocument");
if (!doc.setContent(file))
return champObjects;
//Get the root element
QDomElement docElem = doc.documentElement();
// get the nodes we need
QDomNodeList nodeList = docElem.elementsByTagName("champ");
// Check each node create a Champ object and add it the vector...
for(int i = 0; i < nodeList.count(); i++)
champObjects.append(Champ(nodeList.at(i).toElement()));
return champObjects;
}
第三个填充QComboBox
。我们将使用向量中的索引userData
:
QVector<Champ> champObjects = loadChampsObjects("path.to.xml");
for (unsigned i=0; i<champObjects.count(); i++)
pComboBox->addItem(champObjects[i].name, QVariant(i));
最后,在连接到组合框的currentIndexChanged
信号的插槽中,您可以使用指示向量中索引的userData
轻松访问所选对象的属性:
void champObjectChanged()
{
unsigned vectorIndex = pComboBox->itemData(pComboBox->currentIndex())->toInt();
Champ c = champObjects[vectorIndex];
// do whatever you want with it
}
答案 1 :(得分:0)
使用Qt的DOM组件为您完成所有解析和树构建(请参阅示例here以供其使用)。
对于QComboBox
,QDomDocument
完成后,您可以搜索所有Champ
个节点并阅读Name
个属性。对于每一个,只需使用QComboBox::addItem(const QString& text)
添加它们。
然后将QComboBox::currentIndexChanged (const QString&)
信号连接到XML处理类中的一个方法,该方法在DOM树中搜索Champ
节点,该节点具有与之匹配的Name
属性。一旦找到,就会读出每个子节点值(即'Q','W','E','R'值)。