16

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

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

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

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

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

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

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

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

ありがとう。

4

2 に答える 2

26

実際のデータをメモリに保持する方法、データストアから生成または照会する方法は、完全にあなた次第です。静的データの場合は、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()returns10columnCount()returnsの場合、ビューはメソッドを40回(セルごとに1回)4呼び出し、モデルの内部データ構造内の実際のデータを要求します。data()

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

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

于 2013-01-07T05:08:14.597 に答える
7

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

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の例

于 2019-07-02T15:07:50.613 に答える