私のアプリには、アイテムのリストを保持するためのクラスがあります。
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 派生モデル クラスのオブジェクトが 1 つあります。これは、必要に応じて別のデータベースを指す (および表示する) ようにすることができます。
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 には rowsInserted() および rowsRemoved() と呼ばれるシグナルがありますが、カスタム クラスでは使用できないとドキュメントに記載されています。removeRows() および insertRows() と呼ばれる再実装する仮想関数がありますが、ドキュメントでは、それらの内部で begin(Remove|Insert)Rows() および end(Remove|Insert)Rows() を呼び出す必要があると書かれており、2 つの問題が発生します。 :
begin...Rows() にはQModelIndex 'parent' パラメータが必要ですが、何を使用すればよいかわかりません 。これは QAbstractTreeModel によってツリー内の親ノードを識別するために使用され、明らかにテーブル モデルには必要ありません。- ドキュメントには、基礎となるデータストアを変更する前にこれらの関数を呼び出す必要があると書かれています
モデルをデータベースと同期させるにはどうすればよいですか? ありがとう!