【问题标题】:Read in from a textdata and show it in a QTableView从文本数据中读取并在 QTableView 中显示
【发布时间】:2014-08-13 07:40:25
【问题描述】:

我不知道.. 例如,我会有一个文本数据:

名称、值

汉斯,13 岁

彼得,30

我不知道我是怎么读的。。谁能帮帮我?

QString fileName;
fileName = QFileDialog::getOpenFileName(this, tr("Datei Oeffnen"),"",
                                            "Alle Dateien (*.txt)");
//QString in QFile
    QFile file (fileName);

//Status ob File gelesen werden kann

if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    QMessageBox::information(this, tr("ERROR"), tr("Daten konnten icht eingelesen werden"));
    return;
}
QTextStream stream (&file);
       
while (!file.atEnd())
{
      QString line = stream.readLine();
      QStringList list = line.split(",");
      //dont know, because i woult have 2 Strings. because i would add it in my 
      // Model  : meinModel->setData(firstString,secondString);

}

这是我模型的setData 方法:

bool Model::setData(QString name,QString value )
{
    beginInsertRows(QModelIndex(), names.size(), names.size());
    names.push_back(name);
    values.push_back(value);
    endInsertRows();
    qDebug() << "inhalt name:"<< name;
    qDebug() << "inhalt value:"<< name;

    std::cout << names.size() << std::endl;
    QModelIndex topLeft = createIndex(0,0);
    QModelIndex bottomRights = createIndex(names.size()-1,1);
     //emit a signal to make the view reread identified data
    emit dataChanged(topLeft, bottomRights);
    return true;
}

【问题讨论】:

  • 也许你应该这样做meinModel-&gt;setData(list.at( 0 ), list.at( 1 ) );

标签: c++ qtableview model-view


【解决方案1】:

我认为这是非常困难的解决方案,我做得更容易。我的代码 sn-p 可以按您的意愿工作,在评论中我也会向您展示您的错误。

QStandardItemModel *model = new QStandardItemModel(this);


QString fileName;
//QString in QFile
    QFile fileMy ("G:\\2\\fil.txt");

if (!fileMy.open(QIODevice::ReadOnly | QIODevice::Text))
{
    QMessageBox::information(this, tr("ERROR"), tr("Daten konnten icht eingelesen werden"));
    return;
}
QTextStream stream (&fileMy);

int conterX = 0;
while (!stream.atEnd())//your error was here, you should use stream, not a file
{
      QString line = stream.readLine();
      QStringList list = line.split(",");

      QStandardItem *item1 = new QStandardItem(list.first());//first name
      model->setItem(conterX,0,item1);
      QStandardItem *item2 = new QStandardItem(list.last());//last name
      model->setItem(conterX,1,item2);
      conterX++;

}
ui->tableView->setModel(model);//setmodel

我的文件:

Hans,13
Peter,30
Foo,15
Bar,20
Baz,25

图片上的结果

【讨论】:

  • 感谢您的快速回答,但我有一个 view.cpp 和一个 model.cpp。我不需要 QStandartItem。我需要 2 个字符串。我没有在我的 view.cpp 中设置字符串,因为我有一个带有 setdataMethode 的模型......我怎样才能把它放在字符串中?它必须适合:meinModel->setData(firstString,secondString);
  • 我可以简单地将 QStandardItem 替换为 QString 吗?在每一步中我只能调用一次 setdata..
【解决方案2】:

我能做到吗?

while (!stream.atEnd())
{
      QString line = stream.readLine();
      QStringList list = line.split(",");
      QString firststring;
      firststring = (list.first());
      QString secondstring;
      secondstring = (list.last());
      QString *secondstring = new QString(list.last()); 
      meinModel->setData(firststring, secondstring);

          }

【讨论】:

  • QString *secondstring = new QString(list.last());我想你不需要这个。这是你想要的吗?
  • 我很高兴它是有效的。现在您可以投票支持我的主要答案并将其标记为已接受吗? stackoverflow.com/help/why-vote
  • 我是新的 2 票。 "投票需要 15 声望"
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
相关资源
最近更新 更多