В моем приложении есть класс для хранения списка предметов:
class Database : public QObject
{
Q_OBJECT
public:
Database(QObject *parent, const QString &name);
const Entry& item(int idx) const { Q_ASSERT(idx < itemCount()); return _items.at(idx); }
const QString& name() const { return _name; }
int itemCount() const { return _items.size(); }
bool addItem(const Entry &item);
bool addItems(const Database *source, const QList<int> &idxs);
bool updateItem(int idx, const Entry &updated);
void removeItem(int idx);
void removeItems(const QList<int> &idxs);
private:
QList<Entry> _items;
signals:
void itemsRemoved(int start, int count);
void itemsAdded(int count);
void itemChanged(int index);
void countUpdate();
};
Функции манипуляции с предметами (добавление, обновление, удаление) выдают соответствующие сигналы, когда выполнено (элементы добавлены, изменены, удалены). У меня есть список таких баз данных и QTableView для отображения их содержимого. У меня также есть один объект пользовательского класса, производный от класса QAbstractTableModel, который можно настроить для указания (и отображения) другой базы данных при необходимости:
class DatabaseModel : public QAbstractTableModel
{
Q_OBJECT
public:
DatabaseModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent = QModelIndex()) const { return _data->itemCount(); }
int columnCount(const QModelIndex &parent = QModelIndex()) const { return 5; };
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;
void setDatabase(const Database *data);
{
beginResetModel();
_data = data;
endResetModel();
}
protected:
const Database *_data;
};
У меня проблема с тем, чтобы модель отразила изменения в ее текущей базе данных. Раньше я заставлял его работать, выполняя сброс модели каждый раз, когда что-то менялось в базе данных (вызванное сигналом из базы данных в DatabaseModel), но решил, что это излишне. Теперь я понятия не имею, как правильно связать базу данных и модель.
Подключение сигналов базы данных к модели и заставить модель излучать dataChanged () не работает, потому что количество элементов в базе данных (и, следовательно, строк в модели) меняется. В QAbstractTableModel есть сигналы, которые называются rowInserted () и rowRemoved (), но в документах говорится, что их нельзя использовать в пользовательских классах. Существуют виртуальные функции, которые должны быть переопределены, которые называются removeRows () и insertRows (), но в документах говорится, что я должен вызывать begin (Remove | Insert) Rows () и end (Remove | Insert) Rows () внутри них, что приводит к двум проблемам
- begin ... Rows () нужен параметр «parent» QModelIndex, для которого я понятия не имею, что использовать
РЕДАКТИРОВАТЬ: На самом деле это не имеет значения, теперь я передаю QModelIndex () для этого. Это используется QAbstractTreeModel для идентификации родительского узла в дереве и, по-видимому, не требуется для табличных моделей.
- в документах говорится, что эти функции необходимо вызвать до изменения базового хранилища данных
Как заставить модель синхронизироваться с базой данных? Спасибо!