PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。配布ライセンスは LGPL で公開されています(商用ライセンスも有り)。最新のバージョンは Qt6 に対応した PySide6(記事執筆時点で 6.5.2)です。
Qt は機能が豊富なので覚えるのが大変です。まさが、QToolButton でいわゆる「長押し (hold down)」機能があるとは思いませんでした。
GUI アプリを作るとき、文字列のプルダウンメニューを用意するのが面倒で、ほとんどの場合 QToolBar 上に QToolButton のアイコンを並べて済ませてしまっています。
しかし、アイコンだけでは表現し切れない、かゆいところに手が届くような細かな機能の実現に悩むことがあります。
例えば、ファイルを開く機能にフォルダーアイコンを表示する QToolButton を割り当てて使う場合、頻繁に開くファイルがあれば「最近開いたファイル」みたいにリストをなんらかの形で表示できるともっと便利なのになあと、いつも思っていました。
Qt for Python のドキュメントで QToolButton のページ [1] をよく読むと、ボタンの長押しでメニューを表示できることを知ったので、長押しでメニューを表示させ、そこにリストで用意しておいた文字列を列挙するようなサンプルを作ってみました。
import sys | |
from PySide6.QtGui import QAction | |
from PySide6.QtWidgets import ( | |
QApplication, | |
QFileDialog, | |
QMainWindow, | |
QMenu, | |
QStyle, | |
QToolBar, | |
QToolButton, | |
) | |
class Example(QMainWindow): | |
list_file_recent = ['file 1', 'file 2', 'file 3'] | |
def __init__(self): | |
super().__init__() | |
self.init_ui() | |
self.setWindowTitle('ToolBar') | |
def init_ui(self): | |
toolbar = QToolBar() | |
self.addToolBar(toolbar) | |
# Add buttons to toolbar | |
but_open = QToolButton() | |
but_open.setText('Open') | |
but_open.setToolTip('Open file') | |
pixmap_open = QStyle.StandardPixmap.SP_DirOpenIcon | |
icon_open = self.style().standardIcon(pixmap_open) | |
but_open.setIcon(icon_open) | |
but_open.clicked.connect(self.button_open_clicked) | |
toolbar.addWidget(but_open) | |
# Menu for open | |
menu_open = QMenu(but_open) | |
but_open.setMenu(menu_open) | |
# Sub menu for recent files | |
menu_recent = menu_open.addMenu('Recent files') | |
for file_recent in self.list_file_recent: | |
action_button = QAction(file_recent, self) | |
action_button.triggered.connect(self.on_action_clicked) | |
menu_recent.addAction(action_button) | |
@staticmethod | |
def button_open_clicked(): | |
dialog = QFileDialog() | |
if dialog.exec(): | |
filename = dialog.selectedFiles()[0] | |
print('selected :', filename) | |
def on_action_clicked(self, event): | |
action: QAction = self.sender() | |
print('selected recent file :', action.text()) | |
def main(): | |
app = QApplication(sys.argv) | |
ex = Example() | |
ex.show() | |
sys.exit(app.exec()) | |
if __name__ == '__main__': | |
main() |
Fedora Workstation 39(ベータ版)+ Python 3.11 / PySide 6.5.2 で実行した例を示しました。
フォルダーアイコンをマウスの左ボタンで長押しするとメニューが表示されます。
参考サイト

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

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