1. ホーム
  2. qt

[解決済み] QAbstractTableModelの内部にデータを設定する方法

2022-02-11 21:26:05

質問

Qtでテーブルを実装したいのですが、どうすればいいですか?

QAbstractTableModelと、このモデルを使ったQTableViewを使用することになると思います。

モデルのrowCount()、columnCount()、data()関数を編集する必要があることは理解しています。

しかし、data()関数がデータを取得できるように、モデル内部にデータを正確に設定する方法がわかりません。

setData()関数はこのために用意されているのでしょうか?私はそれがそのパラメータとしてEditRoleを取るのを見たが、私は私のテーブルを編集可能にしたくないので、それはいらない。

では、data()関数を使用して、どのようにモデル内にデータを設定し、またはモデルからデータを取得することができるのでしょうか?

また、data()関数はどのように呼び出されるのでしょうか。つまり、誰が呼び出すのか、どこで呼び出す必要があるのでしょうか。

よろしくお願いします。

ありがとうございます。

解決方法は?

実際のデータをどのようにメモリに保持するか、生成するか、データストアから問い合わせるかは、完全にあなた次第です。静的なデータであれば Qtコンテナクラス またはカスタムデータ構造です。

のみを再実装する必要があります。 setData() メソッドで、編集可能なモデルを作成します。

編集不可の場合、実装が必要なメソッドは4つあります。 QAbstractTableModel のサブクラスがあります。

  • int rowCount()
  • int columnCount()
  • QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole )
  • QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)

これらのメソッドはビューから呼び出され、通常は QTableView のインスタンスです。最初の2つのメソッドは、テーブルの寸法を返す必要があります。たとえば、もし rowCount() は以下を返します。 10columnCount() を返します。 4 を呼び出すと、ビューは data() メソッドを 40 回 (各セルに 1 回) 呼び出して、モデルの内部データ構造の実際のデータを要求します。

例として、カスタムスロット retrieveDataFromMarsCuriosity() をモデルに追加します。このスロットはデータ構造を生成し、そのデータを QPushButton インスタンスで、ボタンをクリックすると新しいデータを取得できます。 さて、データが変更されたときに、ビューが適切に更新できるように、ビューに知らせる必要があります。そのため、データを適切に更新できるようにするために beginRemoveRows() , endRemoveRows() , beginInsertRows() , endInsertRows() とその列の対応表です。

Qt ドキュメント には、これに関して知っておくべきことがすべて書かれています。