web-dev-qa-db-ja.com

QAbstractTableModel内にデータを設定する方法

Qtでテーブルを実装する必要があります。

このモデルを使用したQTableViewを使用して、QAbstractTableModelを提訴すると思います。

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

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

この目的のためにsetData()関数が提供されていますか?テーブルを編集可能にしたくないので、パラメーターとしてEditRoleを使用することを確認しました。

では、data()関数を使用して、モデル内にデータを「設定」する方法、またはモデルが取得するデータを取得するにはどうすればよいですか?

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

これを手伝ってください。

ありがとう。

14
user1173240

実際のデータをメモリに保持する方法、データストアから生成または照会する方法は、完全にあなた次第です。静的データの場合は、 Qtコンテナクラス またはカスタムデータ構造を使用できます。

編集可能なモデルの場合は、setData()メソッドを再実装するだけで済みます。

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

  • 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()が_10_を返し、columnCount()が_4_を返す場合、ビューはdata()メソッドを40回呼び出します(1回は各セル)モデルの内部データ構造の実際のデータを要求します。

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

Qtドキュメント には、これについて知っておく必要のあるすべてのものがあります。

18
dschulz

setData(...)を使用する必要はありません。代わりに、メソッドrowCount()columnCount()data(index)、および場合によってはheaderData(section, horizontalOrVertical)がデータを返すようにQAbstractTableModelをサブクラス化する必要があります。表示したい。 PyQt5に基づく例を次に示します。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

headers = ["Scientist name", "Birthdate", "Contribution"]
rows =    [("Newton", "1643-01-04", "Classical mechanics"),
           ("Einstein", "1879-03-14", "Relativity"),
           ("Darwin", "1809-02-12", "Evolution")]

class TableModel(QAbstractTableModel):
    def rowCount(self, parent):
        # How many rows are there?
        return len(rows)
    def columnCount(self, parent):
        # How many columns?
        return len(headers)
    def data(self, index, role):
        if role != Qt.DisplayRole:
            return QVariant()
        # What's the value of the cell at the given index?
        return rows[index.row()][index.column()]
    def headerData(self, section, orientation, role:
        if role != Qt.DisplayRole or orientation != Qt.Horizontal:
            return QVariant()
        # What's the header for the given column?
        return headers[section]

app = QApplication([])
model = TableModel()
view = QTableView()
view.setModel(model)
view.show()
app.exec_()

これは GitHubリポジトリ から取得され、次の表を表示します。

QAbstractTableModel example

2