Qt ComboBox +搜索XML +将数据从XML打印到GUI

时间:2013-01-09 00:52:41

标签: c++ xml qt

更新

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>

我在描述事情时非常糟糕,所以我用钢笔做了一个小笔,让你更好地理解我:)

My beautiful sketch.

感谢您的支持!希望我明白我的问题。祝你有美好的一天。

2 个答案:

答案 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以供其使用)。

对于QComboBoxQDomDocument完成后,您可以搜索所有Champ个节点并阅读Name个属性。对于每一个,只需使用QComboBox::addItem(const QString& text)添加它们。

然后将QComboBox::currentIndexChanged (const QString&)信号连接到XML处理类中的一个方法,该方法在DOM树中搜索Champ节点,该节点具有与之匹配的Name属性。一旦找到,就会读出每个子节点值(即'Q','W','E','R'值)。