2015-04-20 8 views
0

мне нужно несколько общих советов, чтобы указать мне в правильном направлении решения этой проблемы: У меня есть .txt файл с данными таблицы вроде следующего:чтение и просмотр вкладок разделителями текстовые файлы в Qt C++ с использованием QTableView

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 (правильно?).

Если этот последний абзац был логичным, то мой следующий вопрос: как мне создать QAbstractItemModel с помощью моего .txt-файла? Я не вижу никаких функций в документации, которые это делают? (Примечание: кто-то предложил создать 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().

Эти функции, что «добавить строки» взять QList<QStandardItem*> «S в качестве аргументов, поэтому мне нужно создать QLists, что каждый из которых содержит указатели QStandardItems, которые содержат данные каждой ячейки?

Так что я буду использовать

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

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

Наряду с аргументом QList<QStandardItem*> генерируемых повторными вызовами "<<", проходящих QStandardItem* указателей на пустой QList.

Сделает QStandardItem «S с помощью конструктора

QStandardItem::QStandardItem(const QString & text) 

где я получаю мой QString text путем анализа QFile в строки QString.

Все выглядит хорошо?

Или, может быть, я должен пропустить создание QLists и перейти непосредственно от генерации QStandardItem «с, чтобы передать их в QStandardItemModel с помощью void QStandardItemModel::setItem(int row, int column, QStandardItem * item)

Edit: Я в конечном итоге пропуск создания QLists со следующим способом: QFile файл -> QString линия -> QStringList peices -> QStandardItem -> QStandardItemModel -> QTableView

Спасибо всем, кто способствовал

+1

Вы не можете создать абстрактную модель, это абстрактно. Вам нужно подклассифицировать его. Вы можете ознакомиться с документами для получения дополнительной информации об этом: http://doc.qt.io/qt-5/qabstracttablemodel.html –

+0

Я посмотрел, он говорит, что мой подкласс QAbstractTableModel должен реализовать 'QVariant QAbstractItemModel :: data (const QModelIndex & index, int role = Qt :: DisplayRole) const, но я не знаю, как создавать объекты QModelIndex, которые имеют какое-либо отношение к моему .txt-файлу ?! Я добавил пункт к моему вопросу. – OrangeSherbet

ответ

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); 
+0

Это не ответ, это комментарий, достойный в лучшем случае. –

+0

Я добавил пример – gomons

0

Для первоначального вопроса, то есть как создать пользовательскую модель: это довольно легко, потому что есть удобство базовый класс для моделей столов, QAbstractTableModel которых реализует большинство волосатых методов интерфейса общей модели.

Первым шагом для пользовательской модели таблицы является выбор типа данных для одной строки, например.

struct Data 
{ 
    QTime time; 
    QString pin; 
}; 

Пользовательская модель может затем оперировать списком или вектором этого типа.

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

rowCount() метод может затем быть просто реализован путем возврата размер/кол списка/вектора, columnCount() фиксируется (2 в этом примере) и data() может просто получить доступ к н-й вход и включить просил колонка:

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-код» в качестве заголовков столбцов