PySide超入門【第11回】表形式のデータを表示!QTableWidgetの徹底解説

\ 迷ったらまずTechAcademyの無料カウンセリング! /

「データを表形式で表示したい」
そんなときに活躍するのが QTableWidget です。

このウィジェットを使えば、表のようなレイアウトでテキストや画像、チェックボックスなどを行や列に並べて表示することができます。

本記事では、QTableWidget の基本から実用的なカスタマイズ方法までを徹底解説します。

目次

QTableWidgetとは?

QTableWidget は、固定行・固定列のグリッド表を表示するウィジェットで、テーブルに直接アイテムを挿入して操作できるのが特徴です。

基本コード

from PySide6.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QVBoxLayout
import sys

app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()

table = QTableWidget()
table.setRowCount(3)
table.setColumnCount(2)
table.setHorizontalHeaderLabels(["名前", "年齢"])

table.setItem(0, 0, QTableWidgetItem("田中"))
table.setItem(0, 1, QTableWidgetItem("25"))

#==============================================
# ここにコードを追加します
#==============================================

layout.addWidget(table)
window.setLayout(layout)
window.show()
app.exec()

主なプロパティとメソッド一覧(全解説)

Noメソッド / プロパティ説明
1setRowCount(int)/setColumnCount(int)表の行数と列数を設定table.setRowCount(5)
2setItem(row, col, item)セルにデータ(QTableWidgetItem)を挿入table.setItem(0, 0, QTableWidgetItem("A"))
3setHorizontalHeaderLabels(list)列ヘッダーのラベルを設定table.setHorizontalHeaderLabels(["A", "B"])
4item(row, col)指定セルのデータを取得item = table.item(0, 0).text()
5insertRow(index)/removeRow(index)指定位置に行を挿入・削除table.insertRow(1)
6setEditTriggers(trigger)編集の挙動を設定table.setEditTriggers(QAbstractItemView.NoEditTriggers)
7setSelectionBehavior(mode)行単位 or セル単位の選択を指定SelectRows or SelectItems
8clearContents()中身をすべてクリアtable.clearContents()
9setAlternatingRowColors(bool)行の背景色を交互に設定table.setAlternatingRowColors(True)
10resizeColumnsToContents()各列幅を内容に合わせて自動調整table.resizeColumnsToContents()

各プロパティ・メソッド 詳細解説

【1】行数と列数の設定

  • 概要: 表のサイズ(行数と列数)を定義します。
  • メソッド: setRowCount(int) / setColumnCount(int)
  • 使い方:
table.setRowCount(5)       # 5行に設定
table.setColumnCount(6)    # 6列に設定

【2】セルにアイテムを挿入

  • 概要: 指定したセルに QTableWidgetItem を挿入してデータを表示します。
  • メソッド: setItem(row, col, item)
  • 使い方:
item1 = QTableWidgetItem("佐藤")
item2 = QTableWidgetItem("28")
table.setItem(1, 0, item1)  # (1, 0) のセルに「佐藤」を挿入
table.setItem(1, 1, item2)  # (1, 1) のセルに「28」を挿入

【3】列ヘッダーの設定

  • 概要: 各列のラベルを指定して、表の意味を分かりやすくします。
  • メソッド: setHorizontalHeaderLabels(list[str])
  • 使い方:
table.setHorizontalHeaderLabels(["名前", "年齢", "住所", "職業"])

【4】セルの内容を取得

  • 概要: 指定したセルの QTableWidgetItem を取得して、内容を読み取ります。
  • メソッド: item(row, col)
  • 使い方:
value = table.item(0, 1).text()  # (0, 1) のセルのテキストを取得
print(value)
# 25

【5】行の挿入・削除

  • 概要: 表の途中に行を挿入したり、不要な行を削除できます。
  • メソッド: insertRow(int) / removeRow(int)
  • 使い方:
table.insertRow(1)   # 2行目の前に新しい行を挿入
table.removeRow(2)   # 3行目を削除

【6】編集操作の制御

  • 概要: セルの編集を許可/禁止できます。初期状態では編集可能です。
  • メソッド: setEditTriggers(trigger)
  • 使い方:
from PySide6.QtWidgets import QAbstractItemView
table.setEditTriggers(QAbstractItemView.NoEditTriggers)  # 編集禁止

【7】選択モードの設定

  • 概要: 行単位またはセル単位での選択を切り替えます。
  • メソッド: setSelectionBehavior(mode)
  • 使い方:
from PySide6.QtWidgets import QAbstractItemView
table.setSelectionBehavior(QAbstractItemView.SelectRows)    # 行単位で選択
# または
table.setSelectionBehavior(QAbstractItemView.SelectItems)   # セル単位で選択

【8】中身だけをすべてクリア

  • 概要: 表の構造(行列数)は維持したまま、内容だけを削除します。
  • メソッド: clearContents()
  • 使い方:
table.clearContents()

【9】交互の背景色を設定

  • 概要: 表の行の背景色を交互に設定して、視認性を高めます。
  • メソッド: setAlternatingRowColors(bool)
  • 使い方:
table.setAlternatingRowColors(True)  # TrueでON、FalseでOFF

デフォルトスタイルのままでもグレー/白などで交互に表示され、テーブルが見やすくなります。

【10】列幅の自動調整

  • 概要: 各列の幅を自動で中身に合わせて調整します。長いテキストを含む列が見切れなくなります。
  • メソッド: resizeColumnsToContents()
  • 使い方:
table.resizeColumnsToContents()

※ テーブルの内容を更新したあとに呼ぶと効果的です。

すぐに使える実用例

# 3x2の成績表のようなテーブルを作成
table.setRowCount(3)
table.setColumnCount(2)
table.setHorizontalHeaderLabels(["名前", "点数"])

students = [("山田", "85"), ("佐藤", "90"), ("鈴木", "78")]

for row, (name, score) in enumerate(students):
    table.setItem(row, 0, QTableWidgetItem(name))
    table.setItem(row, 1, QTableWidgetItem(score))

table.setAlternatingRowColors(True)  # TrueでON、FalseでOFF

よくある質問(FAQ)

セルに画像を表示するには?

QTableWidgetItem.setIcon(QIcon(...)) を使えば可能です。

テーブルのセルにチェックボックスを付けられますか?

item.setCheckState(Qt.Checked) を使います。

編集可能にするには?

デフォルトで編集可能です。無効にしている場合は setEditTriggers を確認してください。

行ヘッダーを非表示にできますか?

table.verticalHeader().setVisible(False) で非表示にできます。

行の背景色を変えたいのですが?

item.setBackground(QtGui.QColor("lightblue")) などで指定可能です。

まとめ

QTableWidget を使えば、表形式のUIを簡単に作成することができます。
テキスト、画像、チェックボックスなど、柔軟なレイアウトが可能で、
リストビューやCSV表示、編集可能なテーブルなど多用途に応用できます。

次回は、QTabWidget を使って複数の画面を切り替えて表示できる「タブ付きUI」をご紹介します!

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次