Выравнивание по краю объектов QToolBar
Есть два тулбара. Один из них основной, с кучей экшенов, второй с фиксированным небольшим количеством.
Располагаются они на одном поле.
Мне нужно чтобы второй был прижат к правому краю и всё остальное место занимал первый.
Я решил это не самым изящным костылём - увеличил размер первого и переопределил resizeEvent на изменение размера в зависимости от изменения окна и запретил располагать их по бокам. Но решение крайне не универсально, т.к, например, перестаёт работать если поменять их местами.
Наверняка есть заводские варианты решения этой проблемы.
Минимально воспроизводимый пример:
import sys
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QAction
class FullTextBrowser(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setObjectName('main')
self.resize(750, 650)
self.setMinimumWidth(100)
self._createActions()
self.main_widget = QtWidgets.QWidget()
self.main_layout = QtWidgets.QVBoxLayout(self.main_widget)
self.text_browser = QtWidgets.QTextBrowser()
self.text_browser.setReadOnly(False)
self.text_browser.setObjectName('textBrowser')
self.main_layout.addWidget(self.text_browser)
self.setCentralWidget(self.main_widget)
self.sysToolBar = QtWidgets.QToolBar("Основное")
self.sysToolBar.setAllowedAreas(Qt.BottomToolBarArea | Qt.TopToolBarArea)
self.sysToolBar.setFloatable(False)
self.sysToolBar.setContentsMargins(530, 0, 0, 0)
self.sysToolBar.addAction(self.font_action)
self.sysToolBar.addAction(self.bold_action)
self.sysToolBar.addAction(self.italic_action)
systbbox = QtWidgets.QHBoxLayout(self)
systbbox.setAlignment(Qt.AlignCenter)
systbbox.addWidget(self.sysToolBar)
fileToolBar = QtWidgets.QToolBar("Текст")
fileToolBar.setFloatable(False)
fileToolBar.addAction(self.save_action)
fileToolBar.addAction(self.sound_action)
fileToolBar.addAction(self.close_action)
self.addToolBar(self.sysToolBar)
self.addToolBar(fileToolBar)
def resizeEvent(self, a0: QtGui.QResizeEvent):
self.sysToolBar.setContentsMargins(a0.size().width()-150, 0, 0, 0)
def _createActions(self):
self.save_action = QAction("1", self)
self.sound_action = QAction("2", self)
self.close_action = QAction("3", self)
self.font_action = QAction("4", self)
self.bold_action = QAction("5", self)
self.italic_action = QAction("6", self)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = FullTextBrowser()
w.show()
app.exec_()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так
import sys
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QAction
class FullTextBrowser(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setObjectName('main')
self.resize(750, 650)
self.setMinimumWidth(100)
self._createActions()
self.main_widget = QtWidgets.QWidget()
self.setCentralWidget(self.main_widget)
self.text_browser = QtWidgets.QTextBrowser()
self.main_layout = QtWidgets.QVBoxLayout(self.main_widget)
self.main_layout.addWidget(self.text_browser)
self.sysToolBar = QtWidgets.QToolBar("Основное")
self.sysToolBar.addAction(self.font_action)
self.sysToolBar.addAction(self.bold_action)
self.sysToolBar.addAction(self.italic_action)
systbbox = QtWidgets.QHBoxLayout() # - (self)
systbbox.addWidget(self.sysToolBar, # !!!
alignment=Qt.AlignHCenter, # !!!
stretch=1 # !!!
)
fileToolBar = QtWidgets.QToolBar("Текст")
fileToolBar.setFloatable(False)
fileToolBar.addAction(self.save_action)
fileToolBar.addAction(self.sound_action)
fileToolBar.addAction(self.close_action)
self.addToolBar(self.sysToolBar)
self.addToolBar(fileToolBar)
systbbox.addWidget(fileToolBar, 0) # !!!
self.main_layout.insertLayout(0, systbbox) # !!!
def _createActions(self):
self.save_action = QAction("1", self)
self.sound_action = QAction("2", self)
self.close_action = QAction("3", self)
self.font_action = QAction("Это", self)
self.bold_action = QAction("всегда", self)
self.italic_action = QAction("по центру", self)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = FullTextBrowser()
w.show()
app.exec_()
