2

アップデート

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"));
}}}

なんとかこのようなものを手に入れることができたので、私は今コンボボックスに名前を入れました:)

私はこのコミュニティに不慣れなので、皆さんにお会いできてうれしいです!

まず、私はQtプログラミングにかなり慣れていないことをお知らせしたいと思いますが、学校では基本的なc ++のレッスンをいくつか受けましたが、それはコンソールプログラミングだけであり、そのようなものに取り組んだことはありません。なぜQtを始めたのですか?それは私には簡単に見えました、そしてそれはビジュアルスタジオと比較されました!これが私の問題です。

基本的に、私は自分の "Name =" ""属性を読み取るコンボボックスを持っています。約100は、おそらく少し少なく、もう少し多くはまだわかりません。私はこれまでそのようなことをしたことがないので、これをすべて始める方法がわかりません。基本的に、コンボボックスで「名前」を選択するときにソフトウェアに実行させたいのは、すべての属性( "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>

私は物事を説明するのが本当に苦手なので、あなたが私をよりよく理解できるように、ペンを使って小さなイラストを作りました:)

私の美しいスケッチ。

よろしくお願いします!私の質問が十分にはっきりしていることを願っています。すてきな一日を。

4

2 に答える 2

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;
}

3番目に。を入力し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
}
于 2013-01-09T12:09:37.017 に答える
0

QtのDOMコンポーネントを使用して、すべての解析とツリー構築を行います(使用方法については、こちらの例を参照してください)。

の場合、QComboBoxQDomDocument完了すると、すべてのノードを検索して、それらの属性Champを読み取ることができます。Nameそれぞれについて、を使用QComboBox::addItem(const QString& text)して追加します。

次に、シグナルをXML処理クラスのメソッドに接続します。このメソッドは、DOMツリーで、それに一致する属性を持つノードをQComboBox::currentIndexChanged (const QString&)検索します。見つかったら、その子ノード値(つまり、「Q」、「W」、「E」、「R」の値)をそれぞれ読み取ります。ChampName

于 2013-01-09T08:33:12.403 に答える