使用QTableView在Qt C ++中读取和查看制表符分隔的txt文件

时间:2015-04-20 18:51:53

标签: qt qtableview qfile tab-delimited

我需要一些一般性的建议,指出我正确的方向来解决这个问题:我有一个.txt文件,其表格数据如下:

Time    Pin
11:00   EIO4
12:55   EIO6
16:40   EIO4
20:10   EIO3

etc......

我需要能够解析这个.txt文件。然后我需要在Qt中显示该表(可能在QTableView中)。

我已经研究过使用QTableView,看来我使用QAbstractItemModel*QTableView传递给QTableView::setModel(QAbstractItemModel* model),之后我的QTableView将显示QAbstractItemModel中的任何数据(对吗? )。

如果最后一段是合乎逻辑的,那么我的下一个问题是如何使用我的.txt文件构建QAbstractItemModel?我没有在文档中看到执行此操作的任何功能? (注意:有人建议创建一个QStandardItemModel)

(注意,此段不再相关)QModelIndex createIndex(int row, int column, void* ptr)似乎与此有关,也许?也许这会创建QModelIndex,可以使用QAbstractItemModel传递给QAbstractItemModel::insertRow(QModelIndex)?但是,我仍然不知道如何使这些QModelIndex对象与我的.txt数据有任何关系。

QStandardItemModel文档说

  

如果需要列表或树,通常会创建一个空的   QStandardItemModel并使用appendRow()向项目添加项目,以及   item()访问项目。如果您的模型代表一个表,那么您   通常将表的维度传递给QStandardItemModel   构造函数并使用setItem()将项目放入表中。您   也可以使用setRowCount()setColumnCount()来改变   模型的尺寸。要插入项目,请使用insertRow()或   insertColumn(),要删除项目,请使用removeRow()或   removeColumn()

这些&#34;添加行&#34;把QList<QStandardItem*>作为参数,所以我需要创建QLists,每个QLists包含指向包含每个单元格数据的指针QStandardItems?

所以我会用

void QStandardItemModel::insertRow(int row, const QList<QStandardItem *> & items)

http://doc.qt.io/qt-5/qstandarditemmodel.html#insertRow

通过重复调用&#34; QList<QStandardItem*>&#34;生成的参数<<。将QStandardItem*指针传递给空QList

我将使用构造函数

制作QStandardItem
QStandardItem::QStandardItem(const QString & text)

我通过将QFile解析为QStrings来获取QString text

一切看起来都不错?

或许我应该跳过创建QL并直接从生成QStandardItem&到使用QStandardItemModel

将它们传递到void QStandardItemModel::setItem(int row, int column, QStandardItem * item)

编辑: 我最终使用以下过程跳过创建QLists: QFile文件 - &gt; QString线 - &gt; QStringList peices - &gt; QStandardItem - &gt; QStandardItemModel - &gt; QTableView中

感谢所有贡献者

2 个答案:

答案 0 :(得分:0)

你的方法是正确的。您可以使用QStandardItemModel获取数据。

QStandardItemModel *model = new QStandardItemModel(2,3,this);
model->setHorizontalHeaderItem(0, new QStandardItem(QString("Column1 Header")));
model->setHorizontalHeaderItem(1, new QStandardItem(QString("Column2 Header")));
model->setHorizontalHeaderItem(2, new QStandardItem(QString("Column3 Header")));

ui->tableView->setModel(model);

比你可以添加值:

QStandardItem *firstRow = new QStandardItem(QString("ColumnValue"));
model->setItem(0,0,firstRow);

答案 1 :(得分:0)

对于原始问题,即如何创建自定义模型:这非常简单,因为表模型有一个方便的基类QAbstractTableModel,它实现了一般模型接口的大多数毛茸茸的方法。 / p>

自定义表模型的第一步是确定单行的数据类型,例如

struct Data
{
    QTime time;
    QString pin;
};

然后,自定义模型可以对该类型的列表或向量进行操作。

class MyModel : public QAbstractItemModel
{
private:
    QVector<Data> m_data;
};

然后可以通过返回列表/向量的大小/计数来简单地实现rowCount()方法,columnCount()是固定的(在此示例中为2),data()可以简单地访问第n个条目并打开请求列:

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    const Data &rowData = m_data[index.row()];

    switch (index.row()) {
    case 0: {
        if (role == Qt::DisplayRole) return rowData.time.toString("hh:mm"); // or whatever format you'd like
        else if (role == Qt::EditRole) return rowData.time; // return as QTime
        break;
    }
    case 1: if (role == Qt::DisplayRole || role == Qt::EditRole) return rowData.pin;
        break;
    default: break;
    }
    return QVariant();
}

可选择实施headerData()以获取“时间”和“PIN”作为列标题