複数のQToolButtonをトグル出来るようにするテスト

2022/02/12 categories:Python| tags:Python|QToolButton|PyQt5|

QtのQToolButtonを複数配置して、それらのボタンをトグル切り替えできるようなプログラムを作ってみました。

処理内容

以下のような処理内容を実装したら、QToolButtonをトグル切り替え出来るようになりました。

2つ目のチェック状態を切り替えないためには下記コードのように、mousePressEvent()内でチェックされている場合には何もしないという処理にすることで実装できました。

class Button(QtWidgets.QToolButton):
    def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
        if self.isChecked():
            return
        return super().mousePressEvent(a0)

3つ目のその他ボタンのチェック状態を切り替えるためには下記コードのように、ボタンをクリックしたときに、クリックしたボタン以外をチェックされていない状態にすることで実装できました。

def toggle_button(self):
    sender = QtCore.QObject.sender(self)
    for i in range( self.layout().count() ):
        widget = self.layout().itemAt(i).widget()
        if not widget == sender:
            widget.setChecked(False)

実行結果

Pythonコード

# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets, QtCore, QtGui

class Button(QtWidgets.QToolButton):
    def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
        if self.isChecked():
            return
        return super().mousePressEvent(a0)

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super(Widget, self).__init__()
        self.setWindowTitle('QToolButton toggle test')
        self.setLayout( QtWidgets.QHBoxLayout() )
        self.buttons = []
        for i in range(5):
            button = Button(self)
            button.setText('Button {}'.format(i))
            button.setMinimumSize(100, 40)
            button.setMaximumSize(100, 40)
            button.setCheckable(True)
            button.clicked.connect(self.toggle_button)
            self.buttons.append(button)
            self.layout().addWidget(button)
        self.buttons[0].setChecked(True)
        
    def toggle_button(self):
        sender = QtCore.QObject.sender(self)
        for i in range( self.layout().count() ):
            widget = self.layout().itemAt(i).widget()
            if not widget == sender:
                widget.setChecked(False)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    widget = Widget()
    widget.show()
    app.exec()

Share post

Related Posts

コメント