Qtでテーブルを実装する必要があります。
このモデルを使用したQTableViewを使用して、QAbstractTableModelを提訴すると思います。
モデルのrowCount()、columnCount()、およびdata()関数を編集する必要があることを理解しています。
ただし、data()関数がデータを取得できるように、モデル内のデータを正確に設定する方法がわかりません。
この目的のためにsetData()関数が提供されていますか?テーブルを編集可能にしたくないので、パラメーターとしてEditRoleを使用することを確認しました。
では、data()関数を使用して、モデル内にデータを「設定」する方法、またはモデルが取得するデータを取得するにはどうすればよいですか?
また、data()関数はどのように呼び出されますか?つまり、誰がそれを呼び出し、どこで呼び出す必要がありますか?
これを手伝ってください。
ありがとう。
実際のデータをメモリに保持する方法、データストアから生成または照会する方法は、完全にあなた次第です。静的データの場合は、 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ドキュメント には、これについて知っておく必要のあるすべてのものがあります。
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リポジトリ から取得され、次の表を表示します。