如何使用QList <QStandardItem *>获取列中的所有项目?

时间:2019-07-05 13:14:01

标签: c++ qt csv qstandarditemmodel

我需要从csv文件中绘制图形。我为此使用了QList。我需要获取特定列中的所有项目,例如第4列中的项目。这是解析csv文件并写入表的方法。我需要一种获取行中第4个元素的方法。

        csvModel = new QStandardItemModel(this);
        csvModel->setColumnCount(17);
        csvModel->setHorizontalHeaderLabels(QStringList() << "TEAM ID" << "MISSION TIME" << "PACKET COUNT" << "ALTITUDE" <<"PRESSURE" <<"TEMPERATURE" <<"VOLTAGE" <<"GPS TIME" <<"GPS LATITUDE" <<"GPS LONGITUDE" <<"GPS ALTITUDE" <<"GPS SATS" <<"PITCH" <<"ROLL" <<"BLADE SPIN RATE" <<"SOFTWARE STATE" <<"BONUS DIRECTION");
        ui->csvTableView->setModel(csvModel);

        // Open the file from the resources. Instead of the file
        // Need to specify the path to your desired file
        QFile file("C:/Users/HP/Desktop/test.csv");

        if ( !file.open(QFile::ReadOnly | QFile::Text) ) {
            qDebug() << "File not exists";
        }

        else {
            // Create a thread to retrieve data from a file
            QTextStream in(&file);
            //Reads the data up to the end of file
            while (!in.atEnd())
            {

                QString line = in.readLine();
                // Adding to the model in line with the elements
                QList<QStandardItem *> standardItemsList;
                // consider that the line separated by semicolons into columns
                for (QString item : line.split(",")) {
                    standardItemsList.append(new QStandardItem(item));
                }
                csvModel->insertRow(csvModel->rowCount(), standardItemsList);
            }
            file.close();
        }

1 个答案:

答案 0 :(得分:2)

您应该能够像这样得到它们。

QList<QStandardItem*> column;
for (auto row = 0; row < csvModel->rowCount(); row++) {
    column << csvModel->data(csvModel->index(row, 3)).value<QStandardItem*>();
}

否则,如果要从模型中完全删除该列并获取所有可以使用的项目QStandardItemModel::takeColumn,请记住在调用此方法后必须管理这些指针,因为QStandardItemModel释放了所有权。 / p>

然后,如果要访问每个元素数据,则可以这样做。

for (int i=0; i<column.size (); i++) {
    series->append(i, column.at(i).data().toInt());
}

要提高效率,您可以在一个循环中完成所有这些操作。

QList<int> series;
for (auto row = 0; row < csvModel->rowCount(); row++) {
    auto item = csvModel->data(csvModel->index(row, 3)).value<QStandardItem*>();
    series << item.data().toInt();
}