2023-08-29

QStandardPaths を利用する ~ PySide6 ~

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。配布ライセンスは LGPL で公開されています(商用ライセンスも有り)。最新のバージョンは Qt6 に対応した PySide6(記事執筆時点で 6.5.2)です。

PySide6 で GUI アプリを作る時に、まずは使い慣れた Linux 上で開発をはじめて、他の人にも使ってもらえる段階になったら、Windows 上で動作確認をしてから PyInstaller でパッケージにする、というようなやりかたをよくしています。

PySide6 を利用した GUI は、異なるプラットフォーム間で問題なく動作させられますが、ファイル構造は OS によって違いがあります。そのため、アプリが必要とする設定ファイルや一時ファイルなどの保存先を決めるときには、なんとなく無難に OS に依存しない場所にするか、python の platform モジュールを利用して OS を判定して、判定に応じて保存場所を決めたりしていました。

PySide6 では QStandardPaths [1] という便利なクラスを利用できることを知りました。このクラスには、ユーザー固有のディレクトリやシステム全体の設定ディレクトリといった一般的なタスクのために、ローカル・ファイルシステム上の標準的な場所を問い合わせる関数が用意されています。

早速内容を確認するために QStandardPaths.StandardLocation という列挙型がメンバーとして保持している定数の一覧を表示するサンプルを作ってみました。

qt_standard_location.py
import sys
from PySide6.QtCore import QStandardPaths
from PySide6.QtWidgets import (
QApplication,
QFrame,
QGridLayout,
QLabel,
QScrollArea,
QSizePolicy,
QWidget,
)
class Example(QScrollArea):
def __init__(self):
super().__init__()
self.setWidgetResizable(True)
self.init_ui()
self.setWindowTitle('Standard Location')
def init_ui(self):
base = QWidget()
base.setSizePolicy(
QSizePolicy.Expanding,
QSizePolicy.Expanding
)
self.setWidget(base)
layout = QGridLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
base.setLayout(layout)
names = sorted(
[attr for attr in dir(QStandardPaths.StandardLocation) if not attr.startswith('__')]
)
row = 0
for name in names:
enum_stdloc = getattr(QStandardPaths.StandardLocation, name)
list_loc = QStandardPaths.standardLocations(enum_stdloc)
span = len(list_loc)
label_name = QLabel(name)
label_name.setFrameStyle(
QFrame.Shape.StyledPanel | QFrame.Shadow.Raised
)
label_name.setLineWidth(2)
label_name.setSizePolicy(
QSizePolicy.Policy.Preferred,
QSizePolicy.Policy.Expanding
)
label_name.setStyleSheet("""
QLabel {
padding:0.1em 0.2em;
}
""")
layout.addWidget(label_name, row, 0, span, 1)
for idx, loc in enumerate(list_loc):
label_value = QLabel(loc)
label_value.setFrameStyle(
QFrame.Shape.StyledPanel | QFrame.Shadow.Sunken
)
label_value.setLineWidth(2)
label_value.setSizePolicy(
QSizePolicy.Policy.Expanding,
QSizePolicy.Policy.Expanding
)
label_value.setStyleSheet("""
QLabel {
padding:0.1em 0.2em;
background-color:white;
}
""")
layout.addWidget(label_value, row + idx, 1, 1, 1)
row += span
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()

Fedora Workstation 39(プレリリース版)+ Python 3.11 で実行した例を示しました。

qt_standard_location.py の実行例 (1)

以下は Windows 11 上で実行した例です。

qt_standard_location.py の実行例 (2)

これらの情報を参照するだけで十分であれば、プログラムは、稼働しているプラットフォームを意識する必要がなくなります。

参考サイト

  1. QStandardPaths - Qt for Python

 

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

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



0 件のコメント: