【问题标题】:Selecting from listWidget and adding to textedit从 listWidget 中选择并添加到 textedit
【发布时间】:2016-03-03 06:34:06
【问题描述】:

好吧,所以标题可能被低估了,我会在这里解释一下。我有一个ListWidget 和一个TextEdit。所以第一次我读了一个 xml 文件(这个 xml 文件有其他配置文件的路径)。我将从 XML 文件中获取的所有路径存储在这样的结构中:

标题

struct triStringList
    {
        QString Filename;
        QString block;
        QString flag;
        QString aktioncommand;
    };
    QList<triStringList> allTriList;
    QList <QListWidgetItem*> items;

cpp

void MainWindow::presetXML()
{
    triStringList triStr;
    QXmlGet xmlget;
    xmlget.load(File.xml);
    xmlget.findAndDescend("HEADER");
    while(xmlget.findNext("HEADER_FILES"))
    {
        triStr.Filename.append(xmlget.getAttributeString("Name"));
        triStr.block.append(xmlget.getAttributeString("BlockNr"));
        triStr.flag.append(xmlget.getAttributeString("FLags"));
        xmlget.descend();
        if(xmlget.findNext("AKTION_COMMAND"))
        {
            triStr.aktioncommand  =xmlget.getAttributeString("Name");
        }
        allTriList.append(triStr);
        xmlget.rise
    }
    for(int i=0; i<allTriList.count(); i++)
    {
        Qstring name;
        QFileInfo file(allTriList[i].Filename);
        name = file.fileName();
        preset_tri_list.append(name);
    }
    ui->listWidgetOutput->addItems(preset_tri_list);

好的,我将文件名添加到上面显示的列表小部件中,所有子子项都不会有“动作命令”子项。当在 listwidgetoutput 中单击文件时,我有一个函数可以在我谈到的TextEdit 上显示此 Action 命令: -1st 我选择了选定的项目 - 然后我修剪结构中所有文件的文件名。 -我将它与所选项目进行比较 - 如果匹配,我将相应的操作命令添加到文本编辑中。

void MainWindow::on_listWidgetOutput_itemSelectionChanged()
{
    QString list;        
    QStringList list1;
    items = ui->listWidgetOutput_TRI->selectedItems();
    qDebug()<<"num: "<<items.count();
    qDebug()<< "all: "<<allTriList.count();
    for(int i=0; i<allTriList.count();i++)
    {
       QFile file(allTriList[i].Filename);
        list = file.fileName();
       list1.append(list);          

       for(int j=0; j<items.count(); j++)
       {              
           if(items[j]->text() == list1[j])
           {
               ui->TextEdit->setText(allTriList[i].aktioncommand);
           }
       }
    }
}

但是当我点击文件时,我得到:

ASSERT failure in QList<T>::operator[]: "index out of range", file C:\app\Tools\Qt\5.4\msvc2010_opengl\include\QtCore/qlist.h, line 486

程序崩溃了,通过调试我发现它在这里崩溃了:for(int j=0; j&lt;items.count(); j++) 但它不是空的。 不完全确定发生了什么,我是 Qt 初学者。很抱歉发了很长的帖子

xml 文件:

 <Header>
    <TRIGGER Name="%PATH%/file" FLags="C24" BlockNr="C_Blocknr_1"/>
    <TRIGGER Name="%%PATH%/file" FLags="C25" BlockNr="C_Blocknr_2"/>
    <TRIGGER Name="%PATH%/file" FLags="C74" BlockNr="C_Blocknr_6"/>
    <TRIGGER Name="%PATH%/file" FLags="C94" BlockNr="C_Blocknr_1"/>
    <TRIGGER Name="%%PATH%/file" FLags="C20" BlockNr="C_Blocknr_1"/>
    <TRIGGER Name="%%PATH%/file" FLags="C21" BlockNr="C_Blocknr_1"/>
    <TRIGGER Name="%%PATH%/file" FLags="C49" BlockNr="C_Blocknr_1"/>
 </Header>

【问题讨论】:

  • list1 的大小可以与items 不同。检查一下。
  • 你为什么在那里使用QFile
  • This code 在使用您的 xml sn-p 时对我来说效果很好。输出为this
  • 我不知道为什么它不适合我。它显示 FLags = ""

标签: c++ xml qt parsing


【解决方案1】:

据我了解:您有一个外循环(计数 var i)和一个内循环(计数 var j),用于比较两个列表。对于外部循环 (i) 中的每个项目,您执行内部循环 (j) 中的每个项目的搜索。所以在下面一行

if(items[j]->text() == list1[j])

我假设您打算进行以下比较:

if(items[j]->text() == list1[i])

【讨论】:

  • 或者只是与list比较。 list1 似乎毫无用处。
  • @user5820174 因为它不应该。如果你想这样做,请使用QFileInfo
  • @user5820174 似乎您只是在循环调试值。所以在第一次迭代中你有file1。在第二个你有file1,file2等等。
  • @user5820174 您正在将新文件名附加到相同的triStringList。要么创建一个新对象,要么将triStr.Filename.append 替换为triStr.Filename = 。其他变量也是如此。
  • @user5820174 你确定是FLags 而不是Flags?检查QXmlGet::hasAttribute 返回的内容。
猜你喜欢
  • 2012-11-29
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2014-10-14
  • 2020-01-11
  • 2019-10-23
相关资源
最近更新 更多