Передача данных между классом C и QAbstractTableModel

#c #qt #user-interface

Вопрос:

Я создаю графический интерфейс для своего существующего кода. У меня есть класс памяти, который содержит большую часть моих данных, и я хочу отобразить данные в Qtable. Я также хочу, чтобы таблица обновлялась по мере обновления моих данных.

Структура выглядит следующим образом:

 //memory.hpp
class Memory
{
    //Holds and updates the data.


}

//memory_model.hpp
class MemoryModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    MemoryModel(QObject *parent = nullptr);
    int rowCount(const QModelIndex amp;parent = QModelIndex()) const override;
    int columnCount(const QModelIndex amp;parent = QModelIndex()) const override;
    QVariant data(const QModelIndex amp;index, int role = Qt::DisplayRole) const override;
};
 

каков наилучший способ передачи данных из памяти в memory_model. И как мне инициировать изменения данных в memory_model при изменении данных в памяти?

Ответ №1:

Способ инициирования изменений данных зависит от того, как изменяются данные.

Например, прежде чем вставлять какие-либо новые строки в свой внутренний класс памяти C , вы должны вызвать begininsertrow() для вашего MemoryModel объекта. Затем вы бы выполнили фактическое изменение состояния вашей Memory структуры данных C , а затем вызвали бы endinsertrow(), чтобы сообщить табличной модели, что вы закончили вставку всех строк, которые намеревались вставить.

Аналогичный шаблон вызова существует для вставки / удаления столбцов (с beginInsertColumns() помощью / endInsertColumns() и beginRemoveColumns() / endRemoveColumns() ), перемещения строк или цветов (с beginMoveRows() помощью / endMoveRows() / beginMoveColumns() / endMoveColumns() или просто выполнения полного удаления всех кэшированных данных и повторного заполнения с нуля (с beginResetModel() помощью / endResetModel() ).

Если вам не нужно добавлять / удалять / перемещать строки или столбцы, а просто нужно, чтобы таблица обновляла / обновляла / запрашивала содержимое определенной ячейки или набора ячеек, вы можете сделать это, заставив вашу MemoryModel выдавать сигнал dataChanged() для ячеек, которые вы хотите изменить таблица для обновления.