TableView QML Type
モデルからのデータを表示するための、項目のテーブルビューを提供します。詳細...
| Import Statement: | import QtQuick |
| Inherits: | |
| Inherited By: |
プロパティ
- alternatingRows : bool
- animate : bool
(since 6.4) - bottomRow : int
- columnSpacing : real
- columnWidthProvider : var
- columns : int
- contentHeight : real
- contentWidth : real
- currentColumn : int
- currentRow : int
- delegate : Component
- delegateModelAccess : enumeration
(since 6.10) - editTriggers : enumeration
(since 6.5) - keyNavigationEnabled : bool
(since 6.4) - leftColumn : int
- model : model
- pointerNavigationEnabled : bool
(since 6.4) - resizableColumns : bool
(since 6.5) - resizableRows : bool
(since 6.5) - reuseItems : bool
- rightColumn : int
- rowHeightProvider : var
- rowSpacing : real
- rows : int
- selectionBehavior : enumeration
(since 6.4) - selectionMode : enumeration
(since 6.6) - selectionModel : ItemSelectionModel
(since 6.2) - syncDirection : Qt::Orientations
- syncView : TableView
- topRow : int
関連するプロパティ
- editDelegate : Component
- view : TableView
信号
- columnMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex)
(since 6.8) - layoutChanged()
(since 6.5) - rowMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex)
(since 6.8)
添付の信号
方法
- point cellAtIndex(QModelIndex modelIndex)
(since 6.4) - Point cellAtPosition(point position, bool includeSpacing)
- Point cellAtPosition(real x, real y, bool includeSpacing)
- void clearColumnReordering()
(since 6.8) - void clearColumnWidths()
- void clearRowHeights()
- void clearRowReordering()
(since 6.8) - void closeEditor()
(since 6.5) - int columnAtIndex(QModelIndex modelIndex)
(since 6.4) - real columnWidth(int column)
(since 6.2) - void edit(QModelIndex modelIndex)
(since 6.5) - real explicitColumnWidth(int column)
- real explicitRowHeight(int row)
- void forceLayout()
- real implicitColumnWidth(int column)
(since 6.2) - real implicitRowHeight(int row)
(since 6.2) - QModelIndex index(int row, int column)
(since 6.4.3) - bool isColumnLoaded(int column)
(since 6.2) - bool isRowLoaded(int row)
(since 6.2) - Item itemAtCell(point cell)
- Item itemAtIndex(QModelIndex index)
(since 6.5) - QModelIndex modelIndex(point cell)
(since 6.4) - void moveColumn(int source, int destination)
(since 6.8) - void moveRow(int source, int destination)
(since 6.8) - void positionViewAtCell(point cell, PositionMode mode, point offset, rect subRect)
- void positionViewAtColumn(int column, PositionMode mode, real offset, rect subRect)
- void positionViewAtIndex(QModelIndex index, PositionMode mode, point offset, rect subRect)
(since 6.5) - void positionViewAtRow(int row, PositionMode mode, real offset, rect subRect)
- int rowAtIndex(QModelIndex modelIndex)
(since 6.4) - real rowHeight(int row)
(since 6.2) - void setColumnWidth(int column, real size)
- void setRowHeight(int row, real size)
詳細な説明
TableViewには、表示するデータを定義するmodel と、データの表示方法を定義するdelegate があります。
TableViewはFlickable を継承しています。つまり、モデルには任意の数の行と列を含めることができますが、通常、ビューポート内にはテーブルの一部のみが表示されます。 フリック操作を行うと、新しい行と列がビューポートに入り、古い行と列はビューポートから外れて削除されます。ビューポートから外れた行と列は、ビューポートに入る行と列を構築するために再利用されます。そのため、TableViewはパフォーマンスに影響を与えることなく、あらゆるサイズのモデルに対応できます。
TableViewは、ListModel やXmlListModel といった組み込みのQML型から作成されたモデルのデータを表示します。これらのモデルは、TableView内では最初の列のみにデータを入力します。複数の列を持つモデルを作成するには、TableModel を使用するか、QAbstractItemModel を継承したC++モデルを使用してください。
TableView には、デフォルトではヘッダーが含まれていません。ヘッダーを追加するには、Qt Quick コントロールからHorizontalHeaderView およびVerticalHeaderView を使用します。
注:TableViewは 、ビューを埋めるために必要な数のデリゲート項目のみをload します。最適化の目的でTableViewが項目をプリロードすることもありますが、ビューの範囲外の項目が読み込まれる保証はありません。したがって、幅または高さが0のTableViewでは、デリゲート項目がまったく読み込まれない場合があります。
使用例
C++ モデル
以下の例は、C++から複数の列を持つモデルを作成する方法を示しています:
#include <qqml.h>
#include <QAbstractTableModel>
class TableModel : public QAbstractTableModel
{
Q_OBJECT
QML_ELEMENT
public:
int rowCount(const QModelIndex & = QModelIndex()) const override
{
return 200;
}
int columnCount(const QModelIndex & = QModelIndex()) const override
{
return 200;
}
QVariant data(const QModelIndex &index, int role) const override
{
switch (role) {
case Qt::DisplayRole:
return QString("%1, %2").arg(index.column()).arg(index.row());
default:
break;
}
return QVariant();
}
QHash<int, QByteArray> roleNames() const override
{
return { {Qt::DisplayRole, "display"} };
}
};その後、TableViewDelegate は自動的にこのモデルを使用して、モデルへのデータの設定やモデルからのデータの取得を行います。TableViewDelegate は、表示テキストにQt::DisplayRole を使用し、モデルのデータ編集にはQt::EditRole を使用します。
以下のスニペットは、カスタムデリゲート内でQMLからモデルを使用する方法を示しています:
import QtQuick
import TableModel
TableView {
anchors.fill: parent
columnSpacing: 1
rowSpacing: 1
clip: true
model: TableModel {}
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
Text {
text: display
}
}
}QML モデル
プロトタイピングや(Web APIなどからの)非常に単純なデータの表示には、TableModel を使用できます:
import QtQuick
import Qt.labs.qmlmodels
TableView {
anchors.fill: parent
columnSpacing: 1
rowSpacing: 1
clip: true
model: TableModel {
TableModelColumn { display: "name" }
TableModelColumn { display: "color" }
rows: [
{
"name": "cat",
"color": "black"
},
{
"name": "dog",
"color": "brown"
},
{
"name": "bird",
"color": "white"
}
]
}
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
border.width: 1
Text {
text: display
anchors.centerIn: parent
}
}
}TableViewDelegate はQt::EditRole を使用してデータを設定するため、デリゲートがTableViewDelegate である場合は、TableModelColumn でeditロールを指定する必要があります:
model: TableModel {
TableModelColumn { display: "name", edit: "name" }
TableModelColumn { display: "color", edit: "color" }
rows: [
{
"name": "cat",
"color": "black"
},
{
"name": "dog",
"color": "brown"
},
{
"name": "bird",
"color": "white"
}
]
}項目の再利用
TableViewは、新しい行や列がフリック操作で画面に表示されるたびにdelegate からインスタンスを生成するのではなく、デフォルトでデリゲートアイテムを再利用します。このアプローチにより、デリゲートの複雑さに応じてパフォーマンスが大幅に向上します。
アイテムがフリックされて画面外に出されると、そのアイテムは未使用アイテムの内部キャッシュである再利用プールに移動します。この際、その旨をアイテムに通知するためにTableView::pooled シグナルが発信されます。同様に、アイテムがプールから再び画面内に移動されるときには、TableView::reused シグナルが発信されます。
アイテムが再利用される際、モデルから取得されたアイテムのプロパティはすべて更新されます。これには、index 、row 、column に加え、モデルロールも含まれます。
注: デリゲート内部に状態を保存することは避けてください 。やむを得ず保存する場合は、TableView::reused シグナルを受信した際に手動でリセットしてください。
アイテムにタイマーやアニメーションがある場合は、TableView::pooled シグナルを受信した際にそれらを一時停止することを検討してください。そうすることで、表示されていないアイテムのためにCPUリソースを消費することを回避できます。同様に、アイテムに再利用できないリソースがある場合は、それらを解放することもできます。
アイテムを再利用したくない場合、またはdelegate が再利用をサポートしていない場合は、reuseItems プロパティをfalse に設定できます。
注: アイテムがプール内にある間も 、そのアイテムは存続しており、接続されたシグナルやバインディングに応答する場合があります。
次の例は、回転する矩形をアニメーション化するデリゲートを示しています。これがプールされると、アニメーションは一時的に一時停止されます。
Component {
id: tableViewDelegate
Rectangle {
implicitWidth: 100
implicitHeight: 50
TableView.onPooled: rotationAnimation.pause()
TableView.onReused: rotationAnimation.resume()
Rectangle {
id: rect
anchors.centerIn: parent
width: 40
height: 5
color: "green"
RotationAnimation {
id: rotationAnimation
target: rect
duration: (Math.random() * 2000) + 200
from: 0
to: 359
running: true
loops: Animation.Infinite
}
}
}
}行の高さと列の幅
新しい列がフリック操作で表示範囲に表示されると、TableView は `columnWidthProvider` を呼び出してその幅を決定します。この関数が設定されている場合、この関数だけで列の幅が決定されます。そうでない場合、setColumnWidth() によって明示的な幅が設定されているかどうかが確認されます。設定されていない場合は、implicitColumnWidth() が使用されます。 列の暗黙的な幅は、その列の現在読み込まれているデリゲート項目の中で見つかった最大のimplicit width と同じになります。デリゲートに対して直接width を明示的に設定しようとしても効果はなく、無視されて上書きされます。このロジックは行の高さにも同様に適用されます。
デフォルトのロジックと同等のcolumnWidthProvider の実装例は次の通りです:
columnWidthProvider: function(column) {
let w = explicitColumnWidth(column)
if (w >= 0)
return w;
return implicitColumnWidth(column)
}列の幅が決定されると、同じ列内の他のすべてのアイテム(後でフリック操作によってビュー内に表示されたアイテムも含む)は、この幅に合わせてサイズが調整されます。
注: 列全体がビューの外へフリックされた場合、その列の決定済み幅は 破棄され、再びビュー内にフリックされた際には再計算されます。 つまり、幅がimplicitColumnWidth()に依存している場合、列がビューポートに入った時点での行位置によって、計算結果が毎回異なる可能性があります(implicitColumnWidth()は、現在loaded 状態にあるデリゲート項目のみを考慮するためです)。これを回避するには、columnWidthProvider を使用するか、同じ列内のすべてのデリゲート項目でimplicitWidth を同じ値に設定する必要があります。
ビューポート内の行および列について、rowHeightProvider またはcolumnWidthProvider が返す値を変更する場合は、forceLayout を呼び出す必要があります。これにより、TableViewに対して、プロバイダ関数を再度使用してレイアウトを再計算および更新する必要があることが通知されます。
Qt 5.13 以降、特定の列を非表示にしたい場合は、その列の `columnWidthProvider ` から `0 ` を返すことができます。同様に、行を非表示にするには、`rowHeightProvider ` から 0 を返すことができます。負の数や `undefined` を返した場合、TableView はデリゲートの項目に基づいてサイズを計算するフォールバック処理を行います。
注: アイテムのサブピクセル単位での配置を避けるため、行または列のサイズは 整数である必要があります。
次の例は、関数が返す値を変更するタイマーと組み合わせて、単純なcolumnWidthProvider を設定する方法を示しています。配列が変更されると、forceLayout が呼び出され、変更が反映されます:
TableView {
id: tableView
property var columnWidths: [100, 50, 80, 150]
columnWidthProvider: function (column) { return columnWidths[column] }
Timer {
running: true
interval: 2000
onTriggered: {
tableView.columnWidths[2] = 150
tableView.forceLayout();
}
}
}セルの編集
編集デリゲートを指定することで、ユーザーにテーブルセルの編集を許可できます。編集デリゲートは、editTriggers に基づいてインスタンス化されます。デフォルトでは、ユーザーがセルをダブルタップしたとき、またはQt::Key_Enter やQt::Key_Return などを押したときにインスタンス化されます。編集デリゲートは、delegate に設定するアタッチドプロパティであるTableView::editDelegate を使用して設定します。以下のスニペットにその方法を示します:
TableView {
id: tableView
anchors.fill: parent
clip: true
model: TableModel {
TableModelColumn { display: "name" }
rows: [ { "name": "Harry" }, { "name": "Hedwig" } ]
}
selectionModel: ItemSelectionModel {}
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
Text {
anchors.centerIn: parent
text: display
}
TableView.editDelegate: TextField {
anchors.fill: parent
text: display
horizontalAlignment: TextInput.AlignHCenter
verticalAlignment: TextInput.AlignVCenter
Component.onCompleted: selectAll()
TableView.onCommit: {
display = text
// 'display = text' is short-hand for:
// let index = TableView.view.index(row, column)
// TableView.view.model.setData(index, "display", text)
}
}
}
}編集デリゲートがアクティブな状態で、ユーザーがQt::Key_Enter またはQt::Key_Return を押すと、TableView は編集デリゲートに対してTableView::commit シグナルを発行し、編集デリゲートが変更されたデータをモデルに書き戻せるようにします。
注: セルを編集可能にするには 、モデルが `QAbstractItemModel::flags()` をオーバーライドし、`Qt::ItemIsEditable` を返す必要があります。このフラグは、デフォルトでは `QAbstractItemModel ` で有効になっていません。オーバーライドの例は以下のようになります:
Qt::ItemFlags QAbstractItemModelSubClass::flags(const QModelIndex &index) const override
{
Q_UNUSED(index)
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
}TableView delegate にrequired property bool editing プロパティが定義されている場合、編集対象のデリゲートに対してtrue に設定されます。使用方法の例については、editDelegate のドキュメントを参照してください。
オーバーレイとアンダーレイ
デリゲートからインスタンス化されるすべての新しいアイテムは、z の値が1 に設定されたcontentItem の子として配置されます。TableView内に独自のアイテムを、Flickableの子アイテムとして追加することができます。それらのz の値を制御することで、テーブルアイテムの上または下に配置させることができます。
以下は、テーブルの上にテキストを追加し、フリック操作時にテーブルと一緒に移動させる方法を示す例です:
TableView {
id: tableView
topMargin: header.implicitHeight
Text {
id: header
text: "A table header"
}
}次に、特定のセルの上に常に表示されるオーバーレイアイテムを作成する方法を示す別の例です。ユーザーが、例えばその前の列のサイズを変更した場合、セルの位置がchange するため、これにはもう少し多くのコードが必要になります。
Rectangle {
id: overlay
width: 20
height: 20
radius: 10
color: "blue"
z: 10
parent: tableView.contentItem
Connections {
target: tableView
function onLayoutChanged() {
let item = tableView.itemAtCell(5, 5)
let insideViewport = item !== null
overlay.visible = insideViewport
if (insideViewport) {
overlay.x = item.x
overlay.y = item.y
}
}
}
}また、contentItem ではなく、オーバーレイをセルに直接親として設定することも可能です。ただし、セルがビューポートからフリックされて外れるたびにアンロードされたり再利用されたりするため、この方法は不安定になります。
項目の選択
`selectionModel ` プロパティに `ItemSelectionModel ` を割り当てることで、TableView に選択機能を追加できます。これにより、TableView はこのモデルを使用して、どのデリゲート項目を選択済みとして表示し、どの項目を現在選択中として表示するかを制御します。`selectionBehavior ` を設定することで、ユーザーが個々のセル、行、または列を選択できるかどうかを制御できます。
デリゲートが選択されているか、またはアクティブであるかを確認するには、以下のプロパティを宣言してください(デリゲートが `TableViewDelegate` である場合は、これらのプロパティはすでに追加されています)。
注: ` selected ` および `current `プロパティは 、`required` として定義する必要があります。これにより、TableView に対して、これらの値の更新を担当すべきであることを通知します。そうしない場合、これらのプロパティは単に無視されます。「必須のプロパティ」も参照してください。
以下のコードスニペットは、selected プロパティに応じてデリゲートを異なる方法でレンダリングする方法を示しています:
TableView {
id: tableView
anchors.fill: parent
clip: true
model: TableModel {
TableModelColumn { display: "name" }
rows: [ { "name": "Harry" }, { "name": "Hedwig" } ]
}
selectionModel: ItemSelectionModel {}
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 30
color: selected ? "blue" : "lightgray"
required property bool selected
Text { text: display }
}
}currentRow およびcurrentColumn プロパティは、デリゲートが現在の項目と同じ行または列にあるかどうかに応じて、異なる方法でレンダリングする必要がある場合にも役立ちます。
注: Qt Quick Controlsには、ユーザーがセルを選択できるようにするためのSelectionRectangle が用意されています。
注:デフォルトでは 、ユーザーがセルをタップすると、そのセルはcurrent 状態になり、選択は解除されます。このようなデフォルトのタップ動作が不要な場合(たとえば、デリゲート内でカスタムポインタハンドラを使用している場合など)、pointerNavigationEnabled をfalse に設定することができます。
キーボードによるナビゲーション
キーボードナビゲーションをサポートするには、selectionModel プロパティにItemSelectionModel を割り当てる必要があります。そうすることで、TableView はこのモデルを使用して、モデルのcurrentIndex を操作するようになります。
current として自身をレンダリングするのはデリゲートの役割です。これを行うには、デリゲートにrequired property bool current プロパティを追加し、その状態に応じて外観を変化させます。current プロパティの値は TableView によって設定されます。また、独自のキーハンドラを実装したい場合など、キーボードナビゲーションを完全に無効化するには、keyNavigationEnabled をfalse に設定します。
注:デフォルトでは 、TableViewDelegate は現在のセルと選択されているセルを表示するため、これらのプロパティを追加する必要はありません。
以下の例は、カスタムデリゲート内で、current およびselected プロパティとキーボードナビゲーションを組み合わせて使用する方法を示しています:
ApplicationWindow {
width: 800
height: 600
visible: true
ScrollView {
anchors.fill: parent
TableView {
id: tableView
clip: true
interactive: true
rowSpacing: 1
columnSpacing: 1
model: TableModel {
TableModelColumn { display: "checked" }
TableModelColumn { display: "amount" }
TableModelColumn { display: "fruitType" }
TableModelColumn { display: "fruitName" }
TableModelColumn { display: "fruitPrice" }
rows: [
{
checked: false,
amount: 1,
fruitType: "Apple",
fruitName: "Granny Smith",
fruitPrice: 1.50
},
{
checked: true,
amount: 4,
fruitType: "Orange",
fruitName: "Navel",
fruitPrice: 2.50
},
{
checked: false,
amount: 1,
fruitType: "Banana",
fruitName: "Cavendish",
fruitPrice: 3.50
}
]
}
selectionModel: ItemSelectionModel {}
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
required property bool selected
required property bool current
border.width: current ? 2 : 0
color: selected ? "lightblue" : palette.base
Text{
text: model.display
padding: 12
}
}
}
}
SelectionRectangle {
target: tableView
}
}コピーと貼り付け
TableView のコピーおよび貼り付け操作を実装するには、通常、QUndoStack (またはその他の元に戻す/やり直しフレームワーク)の使用も含まれます。QUndoStack を使用すると、行の追加や削除、クリップボードからのデータの貼り付けなど、モデルに対して行われたさまざまな操作を保存し、後で元に戻すことができます。 ただし、実行可能な操作やそれらの取り消し方法を記述するQUndoStack は、モデルやアプリケーションの要件に合わせて設計する必要があります。そのため、TableViewにはコピーと貼り付けを処理するための組み込みAPIは用意されていません。
以下のスニペットは、モデルおよびTableViewにコピーと貼り付けの機能を追加する方法の参考として利用できます。これは、QAbstractItemModel にある既存のmimeデータAPIと、QClipboard を組み合わせて使用しています。このスニペットはそのままでも動作しますが、QUndoStack を使用するように拡張することも可能です。
// Inside your C++ QAbstractTableModel subclass:
Q_INVOKABLE void copyToClipboard(const QModelIndexList &indexes) const
{
QGuiApplication::clipboard()->setMimeData(mimeData(indexes));
}
Q_INVOKABLE bool pasteFromClipboard(const QModelIndex &targetIndex)
{
const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData();
// Consider using a QUndoCommand for the following call. It should store
// the (mime) data for the model items that are about to be overwritten, so
// that a later call to undo can revert it.
return dropMimeData(mimeData, Qt::CopyAction, -1, -1, targetIndex);
}たとえば、これら2つの関数はQMLから次のように使用できます:
TableView {
id: tableView
model: tableModel
selectionModel: ItemSelectionModel {}
Shortcut {
sequence: StandardKey.Copy
onActivated: {
let indexes = tableView.selectionModel.selectedIndexes
tableView.model.copyToClipboard(indexes)
}
}
Shortcut {
sequence: StandardKey.Paste
onActivated: {
let targetIndex = tableView.selectionModel.currentIndex
tableView.model.pasteFromClipboard(targetIndex)
}
}
}関連項目: TableView::editDelegate 、TableView::commit 、editTriggers 、edit()、closeEditor()、layoutChanged()、QAbstractItemModel::mimeData()、QAbstractItemModel::dropMimeData()、QUndoStack 、QUndoCommand 、およびQClipboard 。
プロパティのドキュメント
alternatingRows : bool
このプロパティは、行の背景色を交互に変更するかどうかを制御します。デフォルト値はスタイルによって異なります。
注: この プロパティは 単なるヒントであるため、カスタムデリゲートでは無視される場合があります。デリゲート外部から色を設定できるようにするため、このヒントが `true` の場合は、デリゲート内で `palette.base ` と `palette.alternateBase ` を交互に設定することを推奨します。例:
background: Rectangle {
color: control.row === control.tableView.currentRow
? control.palette.highlight
: (control.tableView.alternatingRows && control.row % 2 !== 0
? control.palette.alternateBase
: control.palette.base)
}animate : bool [since 6.4]
このプロパティを設定することで、TableView がcontentItem (contentX およびcontentY )をアニメーション表示するかどうかを制御できます。これは、positionViewAtCell() によって使用されるほか、キーボードを使用してthe current index を操作する際にも使用されます。デフォルト値はtrue です。
false に設定すると、進行中のアニメーションは直ちに停止します。
注:この プロパティは あくまでヒントに過ぎません。例えば、ターゲットセルがloaded でない場合など、TableView はアニメーションを使用せずにコンテンツアイテムを配置することを選択する場合があります。ただし、false に設定された場合、アニメーションは常に無効になります。
このプロパティは Qt 6.4 で導入されました。
positionViewAtCell()も参照してください 。
bottomRow : int
このプロパティは、ビュー内で現在表示されている最下段の行を保持します。
leftColumn 、rightColumn 、およびtopRowも参照してください 。
columnSpacing : real
このプロパティは、列間の間隔を指定します。
デフォルト値は0 です。
columnWidthProvider : var
このプロパティには、モデル内の各列の列幅を返す関数を設定できます。TableView が特定の列の幅を知る必要があるたびに、この関数が呼び出されます。この関数は、TableView がその幅を知る必要がある列(column )を1つの引数として受け取ります。
Qt 5.13 以降、特定の列を非表示にしたい場合は、その列の `0 ` 幅を返すことができます。負の数または `undefined` を返した場合、TableView はデリゲート項目に基づいて幅を計算します。
注:column WidthProvider は 通常、カラムの読み込み直前(またはレイアウト実行時)に 2 回呼び出されます。1 回目は、カラムが表示されるかどうか、および読み込むべきかどうかを判断するためです。2 回目は、すべてのアイテムの読み込みが完了した後のカラムの幅を決定するためです。 デリゲート項目のサイズに基づいて列の幅を計算する必要がある場合は、すべての項目が読み込まれた後の2回目の呼び出しを待つ必要があります。これを確認するには、isColumnLoaded(column) を呼び出し、まだその状態になっていない場合は単に -1 を返すようにします。
rowHeightProvider 、isColumnLoaded()、およびRow heights and column widthsも参照してください 。
columns : int [read-only]
このプロパティには、テーブルの列数が格納されます。
注: columns は 通常、モデルの列数と等しくなりますが、保留中のモデルの変更がすべて処理されるまでは、一時的に異なる場合があります。
モデルがリストの場合、columns の値は1 になります。
このプロパティは読み取り専用です。
contentHeight : real
このプロパティには、データモデル内の行数に対応するために必要なテーブルの高さが格納されます。これは通常、view のheight とは一致しません。つまり、テーブルの高さはビューポートの高さよりも大きくなることも、小さくなることもあります。TableView は、モデル内のすべての行を読み込まない限り、テーブルの正確な高さを常に把握できるとは限らないため、contentHeight は通常、最初に読み込まれたテーブルに基づいて推定された値となります。
テーブルの高さが分かっている場合は、contentHeight に値を割り当てて、TableView に対する不要な計算や更新を回避してください。
「 contentWidth 」および「rowHeightProvider 」も参照してください 。
contentWidth : real
このプロパティには、モデル内の列数を収容するために必要なテーブルの幅が格納されます。これは通常、view のwidth とは一致しません。つまり、テーブルの幅はビューポートの幅よりも大きくなったり小さくなったりする可能性があります。TableView は、モデル内のすべての列を読み込まない限り、テーブルの正確な幅を常に把握できるとは限らないため、contentWidth は通常、最初に読み込まれたテーブルに基づいて推定された値となります。
テーブルの幅が分かっている場合は、contentWidth に値を割り当てて、TableView に対する不要な計算や更新を回避してください。
「 contentHeight 」および「columnWidthProvider 」も参照してください 。
currentColumn : int [read-only]
この読み取り専用プロパティは、current. であるアイテムを含むビューの列を保持します。現在のアイテムがない場合は、-1 となります。
注: `TableView ` が現在の列を報告するためには 、`selectionModel` に `ItemSelectionModel ` を割り当てる必要があります。
関連項目: currentRow 、selectionModel 、およびSelecting items 。
currentRow : int [read-only]
この読み取り専用プロパティは、current. であるアイテムを含むビュー内の行を保持します。現在のアイテムがない場合は、-1 となります。
注: TableView が現在の行を正しく報告するためには 、selectionModel にItemSelectionModel を割り当てる必要があります。
関連項目: currentColumn 、selectionModel 、およびSelecting items 。
delegate : Component
デリゲートは、ビューによってインスタンス化される各セル項目を定義するテンプレートを提供します。任意のカスタムコンポーネントを使用できますが、TableViewDelegate の使用が推奨されます。これは、アプリケーションのスタイルに合わせてデザインされており、すぐに使える機能が備わっているためです。
TableViewDelegate を使用するには、単にこれをデリゲートとして設定するだけです:
delegate: TableViewDelegate { }モデルのインデックスは、index のプロパティとしてアクセス可能です。row およびcolumn についても同様です。また、データモデルのタイプに応じて、モデルのプロパティも利用可能です。
デリゲートは、implicitWidth およびimplicitHeight を使用してサイズを指定する必要があります。TableView は、その情報に基づいてアイテムを配置します。明示的な幅や高さの設定は無視され、上書きされます。
デリゲート内部では、オプションで以下のプロパティを1つ以上追加できます(デリゲートがTableViewDelegate である場合は例外で、その場合はプロパティはすでに追加されています)。TableView は、デリゲートがどの状態にあるかを通知するために、これらのプロパティの値を変更します。これにより、デリゲートは自身の状態に応じて異なるレンダリングを行うことができます。
true必須のプロパティ bool current - デリゲートがcurrent.- 必須プロパティ bool selected -
trueデリゲートがselected. - 必須プロパティ bool editing - デリゲートが編集中の場合、
trueedited. - 必須プロパティ bool containsDrag -
true列または行が現在このデリゲート上でドラッグされている場合。このプロパティは、HorizontalHeaderView およびVerticalHeaderView でのみサポートされています。(Qt 6.8以降)
以下の例は、カスタムデリゲートでこれらのプロパティを使用する方法を示しています:
delegate: Rectangle {
required property bool current
required property bool selected
border.width: current ? 1 : 0
color: selected ? palette.highlight : palette.base
}注: デリゲート は必要に応じてインスタンス化され、いつでも破棄される可能性があります。また、reuseItems プロパティがtrue に設定されている場合、デリゲートは再利用されます。したがって、デリゲート内に状態情報を保存することは避けるべきです。
関連項目: Row heights and column widths 、Reusing items 、必須プロパティ、TableViewDelegate 、およびTableViewDelegate のカスタマイズ。
delegateModelAccess : enumeration [since 6.10]
このプロパティは、デリゲートがモデルにアクセスする方法を決定します。
| 定数 | 説明 |
|---|---|
DelegateModel.ReadOnly | デリゲートが、コンテキストプロパティ、model オブジェクト、または必須プロパティのいずれかを介してモデルに書き込みを行うことを禁止します。 |
DelegateModel.ReadWrite | デリゲートが、コンテキスト プロパティ、model オブジェクト、または必須プロパティのいずれかを介してモデルに書き込みを行うことを許可します。 |
DelegateModel.Qt5ReadWrite | デリゲートが、model オブジェクトおよびコンテキスト プロパティを介してモデルへの書き込みを行えるようにしますが、必須プロパティを介した書き込みは許可しません。 |
デフォルトはDelegateModel.Qt5ReadWrite です。
このプロパティは Qt 6.10 で導入されました。
「 Qt Quick におけるモデルとビュー #モデルデータの変更」も参照してください 。
editTriggers : enumeration [default: TableView.DoubleTapped | TableView.EditKeyPressed., since 6.5]
このプロパティは、ユーザーがセルの編集を開始できるさまざまな方法を保持します。以下の値の組み合わせが可能です。
| 定数 | 説明 |
|---|---|
TableView.NoEditTriggers | - ユーザーはセルの編集を開始できません。この値が設定されている場合、TableView は、いかなるユーザー操作に対しても編集デリゲートを開いたり閉じたりしません。ただし、アプリケーション側ではedit()およびcloseEditor()を手動で呼び出すことは可能です。 |
TableView.SingleTapped | - ユーザーはセルを1回タップすることで編集できます。 |
TableView.DoubleTapped | - ユーザーはセルをダブルタップすることで編集できます。 |
TableView.SelectedTapped | - ユーザーは、selected cell をタップすることで編集できます。 |
TableView.EditKeyPressed | - ユーザーは、編集キーのいずれかを押すことで、current cell を編集できます。編集キーはOSによって決定されますが、通常はQt::Key_Enter とQt::Key_Return です。 |
TableView.AnyKeyPressed | - ユーザーは、セルナビゲーションキー以外の任意のキーを押すことで、current cell を編集できます。押されたキーは、edit delegate 内のフォーカスオブジェクトにも送信されます。 |
TableView.SelectedTapped 、TableView.EditKeyPressed 、およびTableView.AnyKeyPressed が機能するためには、TableView にselection model が割り当てられている必要があります。これらは、current index が設定されていることに依存しているためです。また、キーイベントを一切受信できるようにするには、TableView にQQuickItem::activeFocus が設定されている必要があります。
セルを編集する際、ユーザーはQt::Key_Tab またはQt::Key_Backtab を押してデータをcommit し、編集を次のセルに移すことができます。この動作は、TableView のQQuickItem::activeFocusOnTab をfalse に設定することで無効にできます。
注: セルを編集可能にするには 、delegate にedit delegate が紐付けられている必要があり、モデルはQAbstractItemModel::flags()からQt::ItemIsEditable を返す必要があります(以下の例を参照)。 指定されたトリガーのいずれかをアクティブにしてもセルを編集できない場合は、補助手段として、edit() を明示的に呼び出してみてください(例:Button やTapHandler から)。これにより、セルが編集できない理由を説明する警告メッセージが表示されます。
Qt::ItemFlags QAbstractItemModelSubClass::flags(const QModelIndex &index) const override
{
Q_UNUSED(index)
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
}このプロパティは Qt 6.5 で導入されました。
TableView::editDelegate 、TableView::commit 、およびEditing cellsも参照してください 。
keyNavigationEnabled : bool [since 6.4]
このプロパティを設定することで、ユーザーがキーボード操作でthe current index を変更できるかどうかを制御できます。デフォルト値はtrue です。
注: TableView でキーボードナビゲーションを利用できるようにするには 、selectionModel にItemSelectionModel を割り当てる必要があります。
このプロパティは Qt 6.4 で導入されました。
関連項目: Keyboard navigation 、selectionModel 、selectionBehavior 、pointerNavigationEnabled 、およびinteractive 。
leftColumn : int
このプロパティは、ビュー内で現在表示されている列のうち、最も左側の列を保持します。
関連項目: rightColumn 、topRow 、およびbottomRow 。
model : model
このプロパティは、テーブルにデータを供給するモデルを保持します。
このモデルは、ビュー内のアイテムを作成するために使用されるデータセットを提供します。モデルは、TableModel 、ListModel 、ObjectModel を使用して QML 内で直接作成することも、カスタムの C++ モデルクラスによって提供することもできます。C++ モデルは、QAbstractItemModel のサブクラスであるか、単純なリストでなければなりません。
「データモデル」も参照してください 。
pointerNavigationEnabled : bool [since 6.4]
このプロパティを設定することで、ユーザーがマウスやタッチ操作でthe current index を変更できるかどうかを制御できます。デフォルト値はtrue です。
このプロパティはQt 6.4で導入されました。
「 selectionModel 」、「keyNavigationEnabled 」、および「interactive 」も参照してください 。
resizableColumns : bool [since 6.5]
このプロパティは、ユーザーがセル間をドラッグして列の幅を変更できるかどうかを指定します。デフォルト値はfalse です。
このプロパティは Qt 6.5 で導入されました。
resizableRows : bool [since 6.5]
このプロパティは、ユーザーがセル間をドラッグして行のサイズを変更できるかどうかを指定します。デフォルト値は `false` です。
このプロパティは Qt 6.5 で導入されました。
reuseItems : bool
このプロパティは、delegate からインスタンス化されたアイテムを再利用するかどうかを指定します。false に設定すると、現在プールされているアイテムはすべて破棄されます。
「 Reusing items 」、「TableView::pooled 」、および「TableView::reused 」も参照してください 。
rightColumn : int
このプロパティは、ビュー内で現在表示されている最も右側の列を保持します。
関連項目: leftColumn 、topRow 、およびbottomRow 。
rowHeightProvider : var
このプロパティには、モデル内の各行の高さを返す関数を格納できます。TableView が特定の行の高さを把握する必要があるたびに、この関数が呼び出されます。この関数は、TableView が高さを把握する必要がある行(row )を1つの引数として受け取ります。
Qt 5.13 以降、特定の行を非表示にしたい場合は、その行の `0 ` 高さを返すことができます。負の数を返した場合、TableView はデリゲート項目に基づいて高さを計算します。
注:rowHeightProviderは 通常、行が読み込まれようとしているとき(またはレイアウト実行時)に2回呼び出されます。1回目は、その行が表示されるかどうか、および読み込むべきかどうかを確認するためです。2回目は、すべてのアイテムの読み込みが完了した後の行の高さを決定するためです。 デリゲート項目のサイズに基づいて行の高さを計算する必要がある場合は、すべての項目が読み込まれた時点での2回目の呼び出しを待つ必要があります。これを確認するには、isRowLoaded(row)を呼び出し、まだ読み込みが完了していない場合は単に-1を返すようにしてください。
columnWidthProvider 、isRowLoaded()、およびRow heights and column widthsも参照してください 。
rowSpacing : real
このプロパティは、行間の間隔を指定します。
デフォルト値は0 です。
rows : int [read-only]
このプロパティには、テーブルの行数が格納されます。
注: rows は 通常、モデル内の行数と一致しますが、保留中のモデルの変更がすべて処理されるまでは一時的に異なる場合があります。
このプロパティは読み取り専用です。
selectionBehavior : enumeration [since 6.4]
このプロパティは、ユーザーがセル、行、または列を選択できるかどうかにかかわらず有効です。
| 定数 | 説明 |
|---|---|
TableView.SelectionDisabled | ユーザーは選択を行うことができません |
TableView.SelectCells | (既定値) ユーザーは個々のセルを選択できます |
TableView.SelectRows | ユーザーは行のみを選択できます |
TableView.SelectColumns | ユーザーは列のみを選択できます |
このプロパティは Qt 6.4 で導入されました。
関連項目: Selecting items 、selectionMode 、selectionModel 、およびkeyNavigationEnabled 。
selectionMode : enumeration [since 6.6]
selectionBehavior がTableView.SelectCells に設定されている場合、このプロパティは、ユーザーが一度に1つのセルを選択できるか、複数のセルを選択できるかを指定します。selectionBehavior がTableView.SelectRows に設定されている場合、このプロパティは、ユーザーが一度に行を1つ選択できるか、複数の行を選択できるかを指定します。selectionBehavior がTableView.SelectColumns に設定されている場合、このプロパティは、ユーザーが一度に1つの列を選択できるか、複数の列を選択できるかを指定します。
利用可能なモードは以下の通りです:
| 定数 | 説明 |
|---|---|
TableView.SingleSelection | ユーザーは、1つのセル、行、または列を選択できます。 |
TableView.ContiguousSelection | ユーザーは、1つの連続したセルブロックを選択できます。選択中にShift 修飾キーを押したままにすることで、既存の選択範囲を拡大または縮小できます。 |
TableView.ExtendedSelection | (デフォルト値) ユーザーは、複数の個別のセルブロックを選択できます。選択中にShift 修飾キーを押したままにすると、既存の選択範囲を拡大または縮小できます。選択中にControl 修飾キーを押したままにすると、現在の選択範囲を解除せずに新しい選択範囲を開始できます。 |
このプロパティは Qt 6.6 で導入されました。
Selecting items 、selectionBehavior 、selectionModel 、およびkeyNavigationEnabledも参照してください 。
selectionModel : ItemSelectionModel [since 6.2]
このプロパティを設定することで、どのデリゲート項目を選択済みとして表示し、どの項目を現在選択中として表示するかを制御できます。デリゲートにrequired property bool selected が定義されている場合、TableView は、選択モデル内の対応するモデル項目の選択状態とこれを同期させます。デリゲートにrequired property bool current が定義されている場合、TableView は、selectionModel.currentIndexとこれを同期させます。
このプロパティは Qt 6.2 で導入されました。
Selecting items 、SelectionRectangle 、keyNavigationEnabled 、およびpointerNavigationEnabledも参照してください 。
syncDirection : Qt::Orientations
TableView でsyncView が設定されている場合、このプロパティは両方のテーブルのフリック方向の同期を制御します。デフォルトはQt.Horizontal | Qt.Vertical であり、これはいずれかのテーブルをどちらの方向にフリックしても、もう一方のテーブルが同じ方向へ同じ量だけフリックされることを意味します。
このプロパティとsyncView を使用することで、オーバーシュート/アンダーシュート、速度、加速度/減速、リバウンドアニメーションなどの違いにかかわらず、2つのTableViewのフリック動作をスムーズに同期させることができます。
代表的な使用例として、複数のヘッダーをテーブルに合わせてフリックさせる場合が挙げられます。
「syncView」も参照してください 。
syncView : TableView
TableView のこのプロパティが別のTableView に設定されている場合、両方のテーブルは、syncDirection に従って、フリック動作、列幅・行高、および間隔に関して同期されます。
syncDirection にQt.Horizontal が含まれている場合、現在のtableViewの列幅、列間隔、および水平方向のフリッキング動作は、syncViewのものと同期します。
syncDirection にQt.Vertical が含まれている場合、現在のtableViewの行の高さ、行間、および垂直方向のフリック動作がsyncViewのものと同期されます。
「syncDirection」も参照してください 。
topRow : int
このプロパティは、ビュー内で現在表示されている最上段の行を保持します。
leftColumn 、rightColumn 、およびbottomRowも参照してください 。
添付プロパティのドキュメント
TableView.editDelegate : Component [attached]
このアタッチされたプロパティは、編集デリゲートを保持します。これは編集が開始されたときにインスタンス化され、編集対象のデリゲートの子として登録されます。TableView delegate と同じ必須プロパティ(index 、row 、column など)をサポートしています。また、display やedit といったモデルのプロパティも利用可能です(モデルによって公開されるrole names に依存します)。
editTriggers で指定されたアクションが満たされ、現在のセルが編集可能になると、編集が開始されます。
注: セルを編集可能にするには 、モデルがQAbstractItemModel::flags() をオーバーライドし、Qt::ItemIsEditable を返す必要があります。
また、edit() およびcloseEditor() をそれぞれ呼び出すことで、編集デリゲートを手動で開いたり閉じたりすることもできます。
編集は、ユーザーがQt::Key_Enter またはQt::Key_Return を押すと終了します(また、TableView にQQuickItem::activeFocusOnTab が設定されている場合は、Qt::Key_Tab またはQt::Key_Backtab を押しても終了します)。 その場合、TableView::commit シグナルが発信されるため、編集デリゲートは変更されたデータをモデルに書き戻すことで対応できます。他の理由(例:ユーザーがQt::Key_Escape を押した場合など)で編集が終了した場合は、このシグナルは発信されません。いずれの場合でも、最終的にはdestruction()が発信されます。
編集デリゲートが表示されている間も、その下のセルは引き続き表示されたままとなるため、編集デリゲートが半透明である場合や、セル全体を覆っていない場合には、下のセルが透けて見えてしまいます。 これを避けたい場合は、編集デリゲートのルートアイテムを不透明なRectangle に設定するか、TableView delegate. 内のアイテムの一部を非表示にするか、のいずれかの方法があります。後者の方法は、 内にrequired property bool editing というプロパティを定義し、それを子アイテムのvisible プロパティにバインドすることで実現できます。以下のスニペットは、カスタムデリゲートでこれを行う方法を示しています:
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
required property bool editing
Text {
id: textField
anchors.fill: parent
anchors.margins: 5
text: display
visible: !editing
}
TableView.editDelegate: TextField {
x: textField.x
y: textField.y
width: textField.width
height: textField.height
text: display
TableView.onCommit: display = text
}
}編集デリゲートがインスタンス化されると、TableView はそれに対してQQuickItem::forceActiveFocus()を呼び出します。代わりに、編集デリゲートの子要素にアクティブなフォーカスを設定したい場合は、編集デリゲートをFocusScope に設定してください。
デフォルトでは、TableViewDelegate が編集デリゲートを提供しますが、独自のものを設定することも可能です:
delegate: TableViewDelegate {
TableView.editDelegate: TextField {
width: parent.width
height: parent.height
text: display
TableView.onCommit: display = text
}
}関連項目: editTriggers 、TableView::commit 、edit()、closeEditor()、Editing cells 、およびTableViewDelegate 。
TableView.view : TableView [attached]
このアタッチされたプロパティは、デリゲートインスタンスを管理するビューを保持しています。これは、デリゲートの各インスタンスにアタッチされています。
Signal ドキュメント
[since 6.8] columnMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex)
このシグナルは、カラムが移動されたときに発火します。カラムの論理インデックスは `logicalIndex` で指定され、以前のインデックスは `oldVisualIndex` で、新しいインデックスの位置は `newVisualIndex` で指定されます。
注: 対応するハンドラは onColumnMoved です。
このシグナルは Qt 6.8 で導入されました。
[since 6.5] layoutChanged()
このシグナルは、loaded の行および列のレイアウトに変更が生じた可能性があるたびに発火します。これは特にforceLayout()が呼び出された場合に発生しますが、行や列のサイズ変更時や、行や列がビューポート内に入った、あるいはビューポート外に出た場合などにも発生します。
このシグナルは、例えばオーバーレイのジオメトリを更新するために使用できます。
注: 対応するハンドラは `onLayoutChanged` です。
このシグナルは Qt 6.5 で導入されました。
forceLayout() およびOverlays and underlaysも参照してください 。
[since 6.8] rowMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex)
このシグナルは、行が移動されたときに発信されます。行の論理インデックスは `logicalIndex` で指定され、以前のインデックスは `oldVisualIndex` で、新しいインデックスの位置は `newVisualIndex` で指定されます。
注: 対応するハンドラは onRowMoved です。
このシグナルは Qt 6.8 で導入されました。
添付のシグナルドキュメント
[attached] commit()
この信号は、edit delegate
この添付されたシグナルは、edit delegate がアクティブ状態で、ユーザーがQt::Key_Enter またはQt::Key_Return を押したときに発火します。また、TableView にQQuickItem::activeFocusOnTab が設定されており、ユーザーがQt::Key_Tab またはQt::Key_Backtab を押した場合にも発火します。
上記以外の理由で編集が終了した場合、このシグナルは発火しません。これには、例えば、ユーザーがQt::Key_Escape を押した場合、デリゲートの外側をタップした場合、編集中の行または列が削除された場合、またはアプリケーションがcloseEditor() を呼び出した場合などが含まれます。
このシグナルを受信すると、編集デリゲートは変更されたデータをモデルに書き戻す必要があります。
注: この プロパティは、`edit delegate` にアタッチする必要があり、`delegate` にはアタッチしないでください。
注: 対応するハンドラは onCommit です。
関連項目: TableView::editDelegate 、editTriggers 、およびEditing cells 。
[attached] pooled()
このシグナルは、アイテムが再利用プールに追加された後に発火します。これを利用して、アイテム内で進行中のタイマーやアニメーションを一時停止したり、再利用できないリソースを解放したりすることができます。
このシグナルは、reuseItems プロパティがtrue に設定されている場合にのみ発火します。
注: 対応するハンドラは `onPooled` です。
関連項目: Reusing items 、reuseItems 、およびreused 。
[attached] reused()
このシグナルは、アイテムが再利用された後に発火します。この時点で、アイテムはプールから取り出されてコンテンツビュー内に配置され、index、row、column などのモデルのプロパティが更新されています。
モデルによって提供されていないその他のプロパティは、アイテムが再利用されても変更されません。デリゲート内に状態を保存することは避けるべきですが、やむを得ず保存する場合は、このシグナルを受信した際にその状態を手動でリセットしてください。
このシグナルは、アイテムが最初に作成されたときではなく、アイテムが再利用されたときに発火します。
このシグナルは、reuseItems プロパティがtrue の場合にのみ発火します。
注: 対応するハンドラは onReused です。
「 Reusing items 」、「reuseItems 」、および「pooled 」も参照してください 。
メソッドのドキュメント
[since 6.4] point cellAtIndex(QModelIndex modelIndex)
モデル内のmodelIndex に対応する、ビュー内のセルを返します。以下の処理を行うための便利関数です:
Qt.point(columnAtIndex(modelIndex), rowAtIndex(modelIndex))セルとは、単に「行」と「列」を単一の型に統合したpoint のことです。
注: point.x は 列に対応し、point.y は行に対応します。
このメソッドは Qt 6.4 で導入されました。
Point cellAtPosition(point position, bool includeSpacing)
テーブル内の指定されたposition にあるセルを返します。position は、contentItem を基準とした相対座標である必要があります。loaded のセルがposition と交差しない場合、戻り値はpoint(-1, -1) となります。
includeSpacing がtrue に設定されている場合、セルのバウンディングボックスには、両側の隣接するrowSpacing およびcolumnSpacing の半分が含まれるものとみなされます。デフォルト値はfalse です。
注: TableView にアタッチされたInput Handlerは、ビューではなくcontentItem 上に自身をインストールします。そのため、ハンドラーによって報告される位置は、mapping を指定することなく、この関数の呼び出しで直接使用できます。
「 columnSpacing 」および「rowSpacing 」も参照してください 。
Point cellAtPosition(real x, real y, bool includeSpacing)
cellAtPosition(Qt.point(x, y), includeSpacing) への電話が便利になります。
[since 6.8] void clearColumnReordering()
以前に適用された列の並べ替えをリセットします。
注: syncView が設定されている場合 、この関数の呼び出しは対応するビュー項目に転送され、列の順序がリセットされます。
このメソッドは Qt 6.8 で導入されました。
void clearColumnWidths()
setColumnWidth() で設定されたすべての列幅をクリアします。
注: syncView が設定されており、かつQt.Horizontal syncDirection が設定されている場合 、列幅は同期ビューによって制御されます。したがって、その場合は、この関数への呼び出しはすべて同期ビューに転送されます。
関連項目: setColumnWidth()、clearRowHeights()、およびRow heights and column widths 。
void clearRowHeights()
setRowHeight() で設定されたすべての行の高さをクリアします。
注: syncView が設定されている場合 、Qt.Vertical やsyncDirection と併用すると、行の高さはsyncビューによって制御されます。したがって、その場合は、この関数への呼び出しはすべてsyncビューに転送されます。
関連項目: setRowHeight()、clearColumnWidths()、およびRow heights and column widths 。
[since 6.8] void clearRowReordering()
以前に適用された行の並べ替えをリセットします。
注: syncView が設定されている場合 、この関数の呼び出しは対応するビュー項目に転送され、行の順序がリセットされます。
このメソッドは Qt 6.8 で導入されました。
[since 6.5] void closeEditor()
ユーザーがセルを編集している場合、この関数を呼び出すと編集が中止され、編集デリゲートのインスタンスが破棄されます。
このメソッドは Qt 6.5 で導入されました。
edit()、TableView::editDelegate 、およびEditing cellsも参照してください 。
[since 6.4] int columnAtIndex(QModelIndex modelIndex)
モデル内のmodelIndex に対応する、ビュー内の列を返します。
このメソッドは Qt 6.4 で導入されました。
rowAtIndex() およびindex()も参照してください 。
[since 6.2] real columnWidth(int column)
指定されたcolumn の幅を返します。列が読み込まれていない(したがって表示されていない)場合、戻り値は-1 となります。
このメソッドは Qt 6.2 で導入されました。
関連項目: setColumnWidth()、columnWidthProvider 、implicitColumnWidth()、isColumnLoaded()、およびRow heights and column widths 。
[since 6.5] void edit(QModelIndex modelIndex)
この関数は、modelIndex を表すセルの編集セッションを開始します。ユーザーがすでに別のセルの編集を行っている場合、そのセッションは終了します。
通常は、代わりにeditTriggers を使用することで、編集セッションを開始するさまざまな方法を指定できます。それだけでは不十分な場合は、この関数を使用できます。セルの編集を完全に制御し、TableView による干渉を防ぐには、editTriggers をTableView.NoEditTriggers に設定してください。
注: selection model 内の` current index ` も` modelIndex` に変更されます。
このメソッドは Qt 6.5 で導入されました。
closeEditor()、editTriggers 、TableView::editDelegate 、およびEditing cellsも参照してください 。
real explicitColumnWidth(int column)
setColumnWidth() で設定された `column ` の幅を返します。columnWidthProvider が使用されている場合、この幅は列の実際の幅と異なる場合があります。列の実際の幅を取得するには、columnWidth() を使用してください。
戻り値が `0 ` である場合は、そのカラムが非表示に設定されていることを意味します。戻り値が `-1 ` である場合は、そのカラムに対して明示的な幅が設定されていないことを意味します。
注: syncView が設定されている場合 、Qt.Horizontal とsyncDirection が設定されていると、同期ビューが列の幅を制御します。したがって、その場合は、この関数への呼び出しはすべて同期ビューに転送されます。
関連項目: setColumnWidth()、columnWidth()、およびRow heights and column widths 。
real explicitRowHeight(int row)
setRowHeight() で設定されたrow の高さを返します。rowHeightProvider が使用されている場合、この高さは列の実際の高さと異なる場合があります。行の実際の高さを取得するには、rowHeight() を使用してください。
戻り値が `0 ` である場合は、その行が非表示に設定されていることを意味します。戻り値が `-1 ` である場合は、その行に対して明示的な高さが設定されていないことを意味します。
注: syncView が設定されており、かつQt.Vertical syncDirection が設定されている場合 、行の高さは同期ビューによって制御されます。したがって、その場合は、この関数への呼び出しはすべて同期ビューに転送されます。
関連項目: setRowHeight()、rowHeight()、Row heights and column widths 。
void forceLayout()
モデルの変更に対する応答はバッチ処理され、1フレームにつき1回のみ処理されるようになっています。つまり、スクリプトの実行中は、TableView が変更の表示を遅延させます。rowSpacing やleftMargin などのプロパティを変更する場合も同様です。
このメソッドを呼び出すと、TableView が即座にレイアウトを更新し、直近の変更が反映されるようになります。
この関数を呼び出すと、表示されている各行および各列のサイズと位置が再評価されます。これは、rowHeightProvider やcolumnWidthProvider に割り当てられた関数が、すでに割り当てられている値とは異なる値を返す場合に必要となります。
[since 6.2] real implicitColumnWidth(int column)
指定されたcolumn の暗黙の幅を返します。これは、その列内の現在のloaded デリゲート項目の中から見つかった最大のimplicitWidth です。
column が読み込まれていない場合(したがって表示されていない場合)、戻り値は-1 となります。
このメソッドは Qt 6.2 で導入されました。
columnWidth()、isRowLoaded()、およびRow heights and column widthsも参照してください 。
[since 6.2] real implicitRowHeight(int row)
指定されたrow の暗黙的な高さを返します。これは、その行内の現在のloaded デリゲート項目の中から見つかった最大のimplicitHeight です。
row が読み込まれていない(したがって表示されていない)場合、戻り値は-1 となります。
このメソッドは Qt 6.2 で導入されました。
rowHeight()、isColumnLoaded()、およびRow heights and column widthsも参照してください 。
[since 6.4.3] QModelIndex index(int row, int column)
ビュー内の `row ` および `column ` にマッピングされる `QModelIndex ` を返します。
row なお、column はビュー内の行と列(テーブルの行と列)を指すものであり、モデル内の行と列を指すものではありません。 単純な `TableView` の場合、これは `model.index(row, column). ` を呼び出すのと同じです。しかし、`TreeView` のような `TableView` のサブクラスでは、データモデルが内部のプロキシモデルでラップされており、ツリー構造がテーブルにフラット化されているため、モデルインデックスを解決するにはこの関数を使用する必要があります。
このメソッドは Qt 6.4.3 で導入されました。
rowAtIndex() およびcolumnAtIndex()も参照してください 。
[since 6.2] bool isColumnLoaded(int column)
指定されたcolumn が読み込まれている場合、true を返します。
列が読み込まれたとは、TableView が、ビュー内でその列を表示するために必要なデリゲート項目を読み込んだ状態を指します。これは通常、その列がユーザーに表示されていることを意味しますが、必ずしもそうとは限りません。
この関数は、列のデリゲート項目(例:columnWidthProvider など)を反復処理する必要がある場合に、それらの項目が確実に利用可能であることを確認するために使用できます。
このメソッドは Qt 6.2 で導入されました。
[since 6.2] bool isRowLoaded(int row)
指定されたrow が読み込まれている場合、true を返します。
行が読み込まれたとは、TableView がビュー内で行を表示するために必要なデリゲート項目を読み込んだ状態を指します。これは通常、その行がユーザーに表示されていることを意味しますが、必ずしもそうとは限りません。
この関数は、行のデリゲート項目(例:rowHeightProvider など)を反復処理する必要があり、それらのデリゲート項目が確実に利用可能であることを確認したい場合に使用できます。
このメソッドは Qt 6.2 で導入されました。
Item itemAtCell(point cell)
読み込まれている場合はcell のデリゲート項目を返し、そうでない場合はnull を返します。
注: 通常、ビュー内に表示されているアイテムのみが 読み込まれます。セルがビューの外へフリックされると、その中のアイテムはアンロードされるか、リサイクルプールに格納されます。そのため、戻り値を保存してはなりません。
[since 6.5] Item itemAtIndex(QModelIndex index)
index を表すセルのインスタンス化されたデリゲート・アイテムを返します。アイテムがloaded でない場合、戻り値はnull になります。
注: 通常、ビュー内に表示されているアイテムのみが 読み込まれます。セルがビューからフリックされて表示されなくなると、その中のアイテムはアンロードされるか、リサイクルプールに格納されます。そのため、戻り値を保存してはなりません。
注: model がQAbstractItemModel でない場合は 、itemAtCell(Qt.point(column, row)) を使用することもできます。ただし、point.x は列に対応し、point.y は行に対応することに注意してください。
このメソッドは Qt 6.5 で導入されました。
[since 6.4] QModelIndex modelIndex(point cell)
以下の操作を行うための便利な関数:
index(cell.y, cell.x)cell は、単にpoint の行と列を単一の型に統合したものです。
注: point.x は 列に、point.y は行にマッピングされます。
このメソッドはQt 6.4で導入されました。
index()も参照してください 。
[since 6.8] void moveColumn(int source, int destination)
source からdestination の位置に列を移動します。
注: syncView が設定されている場合 、列の並べ替えに関する内部インデックスのマッピングはsyncビューによって制御されます。したがって、その場合は、この関数への呼び出しは代わりにsyncビューに転送されます。
このメソッドは Qt 6.8 で導入されました。
[since 6.8] void moveRow(int source, int destination)
source からdestination 位置へ行を移動します。
注: syncView が設定されている場合 、行の並べ替えにおける内部インデックスのマッピングは同期ビューによって制御されます。したがって、その場合は、この関数への呼び出しは代わりに同期ビューに転送されます。
このメソッドは Qt 6.8 で導入されました。
void positionViewAtCell(point cell, PositionMode mode, point offset, rect subRect)
contentX およびcontentY を、cell がmode で指定された位置に来るように配置する。mode は、以下の項目の論理和(OR)で構成される。
| 定数 | 説明 |
|---|---|
TableView.AlignLeft | セルをビューの左側に配置します。 |
TableView.AlignHCenter | セルをビューの水平方向の中央に配置します。 |
TableView.AlignRight | セルをビューの右側に配置します。 |
TableView.AlignTop | セルをビューの上部に配置します。 |
TableView.AlignVCenter | セルをビューの垂直方向の中央に配置します。 |
TableView.AlignBottom | セルをビューの下部に配置します。 |
TableView.AlignCenter | (TableView.AlignHCenter |TableView.AlignVCenter) と同じです。 |
TableView.Visible | セルのいずれかの部分が表示されている場合は、何もしない。そうでない場合は、セル全体が表示されるようにコンテンツ項目を移動する。 |
TableView.Contain | セル全体が表示されている場合は、何もしない。そうでない場合は、セル全体が表示されるようにコンテンツ項目を移動する。セルがビューよりも大きい場合、セルの左上が優先される。 |
垂直方向の配置が指定されていない場合、垂直方向の位置指定は無視されます。水平方向の配置についても同様です。
オプションで、offset を指定することで、contentXおよびcontentYを、目標の位置からさらに指定したピクセル数だけ移動させることができます。例えば、セル[10, 10]が5pxの余白を持って左上隅に配置されるようにビューを配置したい場合は、次のように記述します:
Qt 6.4 以降では、subRect を指定することで、セル全体の境界矩形ではなく、cell 内の矩形上に配置できるようになりました。これは、例えばセルがビューよりも大きく、その特定の部分を確実に表示させたい場合に役立ちます。subRect が考慮されるためには、valid である必要があります。
注: 特定のセルにビューを配置するためにcontentXやcontentYを使用することは推奨されません 。テーブルの先頭から項目を削除しても、他のすべての項目の位置が再配置されるとは限らないため、この方法は信頼性が低いからです。また、TableView は、処理速度を最適化するために、行や列を概算の位置に配置する場合があります。 唯一の例外は、セルがビュー内ですでに表示されている場合です。これは、itemAtCell() を呼び出すことで事前に確認できます。
メソッドは、Component の処理が完了した後にのみ呼び出す必要があります。起動時にビューの位置を調整するには、Component.onCompleted からこのメソッドを呼び出す必要があります。たとえば、ビューを末尾に配置するには:
Component.onCompleted: positionViewAtCell(Qt.point(columns - 1, rows - 1), TableView.AlignRight | TableView.AlignBottom)注: この関数の 2番目の引数は 、以前は Qt.Alignment でした。下位互換性を確保するため、その列挙型は引き続き使用可能です。PositionMode を使用するように変更されたのは Qt 6.4 です。
animateも参照してください 。
void positionViewAtColumn(int column, PositionMode mode, real offset, rect subRect)
contentX を、column がmode 、offset 、およびsubRect で指定された位置にあるように配置します。
呼び出し用の便利なメソッド
[since 6.5] void positionViewAtIndex(QModelIndex index, PositionMode mode, point offset, rect subRect)
index が、mode 、offset 、およびsubRect で指定された位置に来るようにビューを配置します。
呼び出し用の便利メソッド
positionViewAtRow(rowAtIndex(index), mode & Qt.AlignVertical_Mask, offset.y, subRect)
positionViewAtColumn(columnAtIndex(index), mode & Qt.AlignVertical_Mask, offset.x, subRect)このメソッドは Qt 6.5 で導入されました。
void positionViewAtRow(int row, PositionMode mode, real offset, rect subRect)
contentY を、row がmode 、offset 、およびsubRect で指定された位置にあるように配置します。
呼び出し用の便利なメソッド
[since 6.4] int rowAtIndex(QModelIndex modelIndex)
モデル内のmodelIndex に対応する、ビュー内の行を返します。
このメソッドは Qt 6.4 で導入されました。
columnAtIndex() およびindex()も参照してください 。
[since 6.2] real rowHeight(int row)
指定されたrow の高さを返します。行が読み込まれていない(したがって表示されていない)場合、戻り値は-1 になります。
このメソッドは Qt 6.2 で導入されました。
関連項目: setRowHeight()、rowHeightProvider 、implicitRowHeight()、isRowLoaded()、およびRow heights and column widths 。
void setColumnWidth(int column, real size)
列column の明示的な列幅をsize に設定します。
この関数で設定した値を読み戻したい場合は、explicitColumnWidth() を使用する必要があります。columnWidth() は列の実際のサイズを返しますが、columnWidthProvider が設定されている場合、この値は異なる可能性があります。
TableView がcolumn の幅を解決する必要がある場合、まずcolumnWidthProvider を呼び出そうとします。プロバイダーが設定されていない場合にのみ、この関数で設定された幅がデフォルトとして使用されます。 ただし、プロバイダー内部からexplicitColumnWidth()を呼び出し、必要に応じて、例えば常に特定の範囲内に収まるよう値を調整することも可能です。以下のスニペットは、その方法の例を示しています:
columnWidthProvider: function(column) {
let w = explicitColumnWidth(column)
if (w >= 0)
return Math.max(100, w);
return implicitColumnWidth(column)
}size が0 と等しい場合、その列は非表示になります。size が-1 と等しい場合、その列はimplicitColumnWidth()を使用するようにリセットされます。モデルのサイズ範囲外にある列についても、列サイズを指定することができます。
注: model を変更しても、設定したサイズは クリアされません。サイズをクリアするには、clearColumnWidths()を明示的に呼び出す必要があります。
注: syncView が設定されている場合 、Qt.Horizontal (syncDirection )と併せて、同期ビューが列幅を制御します。したがって、その場合は、この関数への呼び出しはすべて同期ビューに転送されます。
注: 列数の多いモデルの場合 、起動時に setColumnWidth() を使用してすべての列の幅を設定することは、最適ではない可能性があります。これにより、起動時間とメモリ(すべての幅を格納するため)を消費することになります。 よりスケーラブルなアプローチとしては、代わりにcolumnWidthProvider を使用するか、デリゲートの暗黙的な幅に依存することです。columnWidthProvider は必要な場合にのみ呼び出され、モデルのサイズの影響を受けません。
columnWidth()、explicitColumnWidth()、setRowHeight()、clearColumnWidths()、およびRow heights and column widthsも参照してください 。
void setRowHeight(int row, real size)
行row の明示的な行高さをsize に設定します。
この関数で設定した値を読み戻したい場合は、explicitRowHeight() を使用する必要があります。rowHeight() は行の実際の高さを返しますが、rowHeightProvider が設定されている場合、この値は異なる可能性があります。
TableView がrow の高さを算出する必要がある場合、まずrowHeightProvider を呼び出そうとします。プロバイダーが設定されていない場合にのみ、デフォルトでこの関数で設定された高さが使用されます。 ただし、プロバイダー内部からexplicitRowHeight()を呼び出し、必要に応じて、例えば常に特定の範囲内に収まるよう値を調整することも可能です。以下のスニペットは、その方法の例を示しています:
rowHeightProvider: function(row) {
let h = explicitRowHeight(row)
if (h >= 0)
return Math.max(100, h);
return implicitRowHeight(row)
}size が0 と等しい場合、その行は非表示になります。size が-1 と等しい場合、その行はimplicitRowHeight()を使用するようにリセットされます。モデルのサイズ範囲外にある行についても、行サイズを指定することができます。
注: model を変更しても、設定したサイズは クリアされません。サイズをクリアするには、clearRowHeights()を明示的に呼び出す必要があります。
注: `syncView ` が設定されており、かつ `Qt.Vertical `syncDirection が設定されている場合 、行の高さは同期ビューによって制御されます。したがって、その場合は、この関数への呼び出しはすべて同期ビューに転送されます。
注: 行数の多いモデルでは 、起動時に setRowHeight() を使用してすべての行の高さを設定することは、最適とは言えません。これにより、起動時間とメモリ(すべての高さを格納するために)が消費されます。 よりスケーラブルなアプローチとしては、代わりにrowHeightProvider を使用するか、デリゲートの暗黙的な高さに依存する方法があります。rowHeightProvider は必要な場合にのみ呼び出され、モデルのサイズの影響を受けません。
rowHeight()、explicitRowHeight()、setColumnWidth()、およびRow heights and column widthsも参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.