2023-10-01

QToolButton を長押し ~ PySide6 ~

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] をよく読むと、ボタンの長押しでメニューを表示できることを知ったので、長押しでメニューを表示させ、そこにリストで用意しておいた文字列を列挙するようなサンプルを作ってみました。

qt_toolbar_2.py
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()
view raw qt_toolbar_2.py hosted with ❤ by GitHub

Fedora Workstation 39(ベータ版)+ Python 3.11 / PySide 6.5.2 で実行した例を示しました。

qt_toolbar_2.py の実行例

フォルダーアイコンをマウスの左ボタンで長押しするとメニューが表示されます。

参考サイト

  1. QToolButton - Qt for Python

 

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

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



0 件のコメント: