Hello World / plɹoM ollǝH

Programmers Live in Vain

QActionでコードもすっきり

メニューやツールバーを実装するときはQPushButtonやコールバックをガリガリ書くのではなくQActionを作る。QActionオブジェクトを作成しておけば、複数のメニューやツールバーをまたいでも、ひとつのQActionオブジェクトで挙動を定義できるし、QActionGroupを使えばラジオボタンも作れる。ショートカットキーやIconも設定できる。

f:id:dungeonneko:20170125160034g:plain

import sys
from PySide.QtCore import *
from PySide.QtGui import *

# ラジオボタン的な挙動をするメニューを作る例
if __name__ == '__main__':

    myapp = QApplication(sys.argv)
    window = QMainWindow()

    # まずはExclusiveなグループを作成
    exclusive_group = QActionGroup(window)
    exclusive_group.setExclusive(True)

    # グループに属するアクションを作る
    def createExclusiveAction(in_name, in_icon, in_shortcut):
        action = QAction(in_name, window)
        action.setActionGroup(exclusive_group)
        action.setIcon(myapp.style().standardIcon(in_icon))
        action.setShortcut(in_shortcut)
        action.setCheckable(True)
        return action

    data = [
        ('Play', QStyle.SP_MediaPlay, 'Q'),
        ('Pause', QStyle.SP_MediaPause, 'W'),
        ('Stop', QStyle.SP_MediaStop, 'E'),
        ('Forward', QStyle.SP_MediaSeekForward, 'R'),
        ('Backward', QStyle.SP_MediaSeekBackward, 'T'),
    ]

    actions = []
    for name, icon, shortcut in data:
        actions.append(createExclusiveAction(name, icon, shortcut))

    # メニューバーとツールバー両方に追加して動作テスト
    menubar = window.menuBar()
    mediamenu = menubar.addMenu('Media')
    toolbar = window.addToolBar('ToolBar')
    for x in actions:
        mediamenu.addAction(x)
        toolbar.addAction(x)

    window.show()
    sys.exit(myapp.exec_())