Как упростить процесс отображения и редактирования списка структур в таблице?

Добрый день! 

Мне необходимо отобразить данные в таблице (приложение на QWidget) с возможностью редактирования полей. Данные представлены в виде QList, а поля содержат типы: string, double и int. Обычно для этого я наследуюсь от QAbstractTableModel, но это довольно утомительно из-за необходимости создавать два файла для модели и описывать множество методов. Существует ли более простой вариант, который требует меньше кода? 
  • 7 декабря 2024 г. 17:43
Ответы на вопрос 2
Добрый день!

Да, существует способ упрощения работы с таблицами в вашем приложении на QWidget с помощью моделей, которые уже реализуют некоторые функции для работы с данными. Одна из возможностей — использовать `QStandardItemModel`, который предоставляет стандартные реализации таблицы и требует меньше кода.

Вот пример, как можно использовать `QStandardItemModel` для отображения и редактирования данных из `QList`:

```cpp
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QHeaderView>
#include <QString>
#include <QList>

struct Data {
    QString name;
    double value;
    int count;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // Ваши данные
    QList<Data> dataList = {
        {"Item 1", 10.5, 2},
        {"Item 2", 20.1, 5},
        {"Item 3", 15.0, 3}
    };

    // Создание модели
    QStandardItemModel model(dataList.size(), 3);
    model.setHeaderData(0, Qt::Horizontal, "Name");
    model.setHeaderData(1, Qt::Horizontal, "Value");
    model.setHeaderData(2, Qt::Horizontal, "Count");

    // Заполнение модели данными
    for (int row = 0; row < dataList.size(); ++row) {
        model.setItem(row, 0, new QStandardItem(dataList[row].name));
        model.setItem(row, 1, new QStandardItem(QString::number(dataList[row].value)));
        model.setItem(row, 2, new QStandardItem(QString::number(dataList[row].count)));
    }

    // Настройка таблицы
    QTableView tableView;
    tableView.setModel(&model);
    tableView.horizontalHeader()->setStretchLastSection(true);
    tableView.resize(400, 300);
    tableView.setWindowTitle("Editable Table");

    // Запуск приложения
    tableView.show();
    return app.exec();
}
```

В этом коде мы используем `QStandardItemModel`, чтобы создать модель и заполнить ее данными из `QList<Data>`. Мы также устанавливаем заголовки для колонок. В таблице `QTableView` пользователи смогут редактировать значения непосредственно в ячейках.

Преимущества данного подхода:
1. Меньше кода по сравнению с реализацией `QAbstractTableModel`.
2. Быстрая настройка и изменение данных.
3. Встроенная поддержка редактирования ячеек.

Если необходима больший контроль или работа с более сложными структурами данных, тогда стоит рассмотреть создание своей модели, но для простых случаев `QStandardItemModel` будет достаточно.
Ну, можете попробовать использовать qtablewidget . У него уже есть своя модель встроенная.
Похожие вопросы