2023-11-12

QTableWidget を使う ~ PySide6

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。

スプレッドシートを使いたければ、Excel のような表計算アプリを使えば良いのです。しかし自分でアプリを作っている時に、簡単なスプレッドシート的なウィジェットを利用できればいいなと思うときがあります。そんな時、よくよく用途を考えると、簡単な入力が出来るテーブル状のウィジェットで用が足りてしまう場合が多いのです。そこで、入力ができるだけのごく簡単なテーブル・ウィジェットを作ってみました。

下記の OS 環境で動作確認をしています。

Fedora Linux 39 x86_64
Python 3.11.6
PySide6 6.6.0

具体的な表があれば、QTableView を利用して表示用のモデルを用意すれば良いのですが、何もないところから使えるようなテーブル状のウィジェットとなると、どうすれば良いか悩んでしまいました。

そういえば QTableWidget という、QTableView とよく似たクラスがあったと思いだして調べて見たところ、行数、列数を指定するだけでテーブルウィジェットとして利用できることが判りましたので、早速簡単なサンプルを作ってみました。入力する文字列と数値は区別したかったので、文字列の入力は左寄せ、数値の時は右寄せでセル内に表示されるようにしました。

worksheet.py の実行例

QTableWidget クラスを継承した WorkSheet クラスとして、少しずつ機能を追加していこうと考えています。

worksheet.py
import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
QApplication,
QHeaderView,
QMainWindow,
QTableWidget,
QTableWidgetItem,
)
class WorkSheet(QTableWidget):
def __init__(self, row_max=256, col_max=100):
super().__init__(row_max, col_max)
self.setStyleSheet("""
QTableWidget {
font-family: monospace;
}
QTableCornerButton::section {
background: #fff;
}
QHeaderView {
font-family: monospace;
background: #eee;
color: #666;
}
""")
self.itemChanged.connect(self.cell_updated)
header_horiz = QHeaderView(Qt.Orientation.Horizontal, parent=self)
header_horiz.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
self.setHorizontalHeader(header_horiz)
header_vert = QHeaderView(Qt.Orientation.Vertical, parent=self)
header_vert.setDefaultAlignment(Qt.AlignmentFlag.AlignRight)
header_vert.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
self.setVerticalHeader(header_vert)
def cell_updated(self, item: QTableWidgetItem):
value = item.text()
if self.is_num(value):
item.setText(str(float(value)))
item.setTextAlignment(Qt.AlignmentFlag.AlignRight)
else:
item.setTextAlignment(Qt.AlignmentFlag.AlignLeft)
@staticmethod
def is_num(str_float: str) -> bool:
try:
float(str_float)
except ValueError:
return False
else:
return True
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('WorkSheet test')
self.resize(800, 600)
self.init_ui()
def init_ui(self):
sheet = WorkSheet()
self.setCentralWidget(sheet)
def main():
"""Main event loop
"""
app = QApplication(sys.argv)
obj = Example()
obj.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
view raw worksheet.py hosted with ❤ by GitHub

参考サイト

  1. QTableWidget - Qt for Python

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



0 件のコメント: