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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
参考サイト

にほんブログ村
#オープンソース

0 件のコメント:
コメントを投稿