Добавление проверяемого QToolButton в QToolBar со значком, текстом и меню
В настоящее время у меня естьQToolBar
с различными проверяемыми действиями, сгруппированными вQActionGroup
установлен наautoExclusive
. Это хорошо работает.
Теперь я хотел бы иметь один с меню, чтобы пользователь мог выбрать поведение этого действия. Поэтому я решил использоватьQToolButton
в сочетании сQAction
Проблема: я нашел 2 способа добавить материал в QToolBar:
- добавление действия: отображает текст действия (рядом со значком) без подменю кнопок инструментов
- добавление кнопки инструмента: не отображает текст действия (только значок), но отображается подменю
Ниже приведен MWE:
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (QMainWindow, QToolBar, QAction, QApplication, QStyle,
QActionGroup, QToolButton, QMenu)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
# Toolbar definition
self.toolBar = QToolBar(self)
self.toolBar.setIconSize(QSize(24, 24))
self.toolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
self.addToolBar(Qt.TopToolBarArea, self.toolBar)
# Creation of 2 dummy actions
a1 = QAction("My action 1", self)
a2 = QAction("My action 2", self)
# Making actions checkable
a1.setCheckable(True)
a2.setCheckable(True)
# Creating one ToolButton with one default action
tB = QToolButton()
tB.setText("Action 3")
a3 = QAction("Action 3", self)
tB.setDefaultAction(a3)
tB.setCheckable(True)
a3.setCheckable(True)
m = QMenu(tB)
sub_a1 = QAction("sub 1", m)
sub_a2 = QAction("sub 2", m)
sub_a1.setCheckable(True)
sub_a2.setCheckable(True)
m.addActions([sub_a1, sub_a2])
tB.setMenu(m)
tB.setPopupMode(QToolButton.ToolButtonPopupMode.MenuButtonPopup)
# Adding some icon to each action
a1.setIcon(QIcon(QApplication.style().standardIcon(QStyle.StandardPixmap.SP_DirIcon)))
a2.setIcon(QIcon(QApplication.style().standardIcon(QStyle.StandardPixmap.SP_FileIcon)))
a3.setIcon(QIcon(QApplication.style().standardIcon(QStyle.StandardPixmap.SP_FileIcon)))
tB.setIcon(QIcon(QApplication.style().standardIcon(QStyle.StandardPixmap.SP_FileIcon)))
ag = QActionGroup(self)
ag.setExclusive(True)
ag.addAction(a1)
ag.addAction(a2)
ag.addAction(a3)
# Two ways to add things to self.toolBar
self.toolBar.addActions([a1, a2, a3]) # <-- (1) adding a3: displays text "Action 3" (beside icon) without submenu
self.toolBar.addActions([a1, a2]) # <-- (2) adding tB: does not display text "Action 3" (only icon)
self.toolBar.addWidget(tB) # but submenu is shown
if __name__ == '__main__':
app = QApplication([])
mainWindow = MainWindow()
mainWindow.show()
app.exec()