我需要一些一般性的建议,指出我正确的方向来解决这个问题:我有一个.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中
感谢所有贡献者
答案 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”作为列标题