複数のQToolButtonをトグル出来るようにするテスト
2022/02/12 categories:Python| tags:Python|QToolButton|PyQt5|
QtのQToolButtonを複数配置して、それらのボタンをトグル切り替えできるようなプログラムを作ってみました。
処理内容
以下のような処理内容を実装したら、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()