2016-03-04 12 views
1

Я пытаюсь использовать архитектуру модели/представления в C++ и QT и должен понимать, как наилучшим образом подходит делить одну ячейку в QTableView на более строк или более столбцов и использовать для них разные виджеты, а также как отображать только несколько столбцов из модели.Qt - модель/представление модели - несколько данных в одной ячейке QTableView

Я хочу держать эту структуру для каждой строки:

- int 
- MyStruct - int 
      - QString 
- 2ndStruct - double 
      - double 
- QString 

Что важно:

  1. Дисплей в 2D таблицы (например, QTableView) - без деревьев. Я могу изменить модель, но мне нужно отобразить ее в таблице.
  2. Показать только некоторые данные из модели.
  3. В соответствии с индексом строк - выберите некоторые столбцы из родителя, а также некоторые данные из child (structs).

У меня есть несколько вопросов:

  1. Как реализовать несколько строк/столбцов в одной ячейке QTableView и использовать различные типы и различные QWidgets для них?
  2. Как выбрать только некоторые данные, которые я хочу показать в поле зрения? Когда я переопределяю «columnCount» в модели, я не могу поставить константу там, потому что хочу использовать эту модель в другом представлении. Я прочитал учебники, и я обнаружил, что нет необходимости переопределять класс представления. Как я могу выбрать только данные, которые я хочу показать?
  3. Лучше использовать 3D-модель (QStandardItemModel с QStandardItems) или 2D-модель (QAbstractTableModel) для этого случая?

ответ

1

Я бы предложил иметь отдельные модели для разных нужд, но пусть они работают с одними и теми же данными.

I.e. классы модели - это просто интерфейсы к фактическим данным, они не должны содержать данные.

Допустим, у вас есть структура/класс с именем RowData. Данные содержат данные, которые вы описали.

Все строки могут быть списком или вектором таких объектов, например. QVector<RowData>

Каждая модель могла бы работать на одной и той же ссылке или указатель на такой контейнер

class AllDataInSeparateColumnsModel : public QAbstractTableModel 
{ 
public: 
    AllDataInSeparateColumnsModel(QVector<RowData> &data, QObject *parent = nullptr) 
     : QAbstractTableModel(parent), m_data(data) 
    {} 

    int rowCount() const { return m_data.count(); } 
    int columnCount() const { return 6; } 

private: 
    QVector<RowData> &m_data; 
}; 

Метод data() для этой модели может затем отобразить столбец 0 в первой междунар, столбец 1 к междунар в MyStruct , столбец 2 в QString в MyStruct и т. д.

Если модели требуется более одного значения за столбец, тогда она может определять свои собственные дополнительные роли. Затем в представлении нужен соответствующий делегат, который может получить эти дополнительные данные по мере необходимости (стандартный делегат отображает только строковое значение для Qt::DisplayRole)

 Смежные вопросы

  • Нет связанных вопросов^_^