Как управлять размещением элементов в QToolBar?

Рейтинг: 1Ответов: 1Опубликовано: 08.06.2023

Я создал боковой toolbar с левой стороны окна приложения.
Добавил туда различные actions. И хотел в самом конце (внизу) добавить изображение .svg.

Отрендерил изображение, добавил в toolbar, и он, как и ожидалось добавился сразу после последнего action.
После этого попытался сдвинуть изображение в низ, но все тщетно. Изображение не реагирует на setGeometry() и у него нет метода setAlignment().
Единственное, что мне удалось, это сделать resize(), к счастью, он работает.

Вот так я реализовал само изображение:

class SvgWidget(QSvgWidget):
    def __init__(self):
        super().__init__()
        self.text = open('logo.svg', 'r')
        self.svg_render = QSvgRenderer(QXmlStreamReader(self.text.read()))
        self.resize(50, 50)

    def paintEvent(self, event) -> None:
        qp = QPainter(self)
        self.svg_render.render(qp)

Я создаю экземпляр этого класса в классе MainWindow:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("2D Map")
        self.resize(800, 600)
        self.widget = QWidget()
        self.setCentralWidget(self.widget)
        self.box = QVBoxLayout(self.widget)
        self.box.setContentsMargins(30, 30, 30, 30)
        self.testAction = QAction(QIcon('imgs/exit.png'), 'Exit', self)
        self.testAction.triggered.connect(app.quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.setObjectName('toolbar')
        self.addToolBar(Qt.ToolBarArea.LeftToolBarArea, self.toolbar)
        self.toolbar.setMovable(False)
        self.toolbar.addAction(self.testAction)
        # вот здесь:
        self.svg = SvgWidget()
        self.toolbar.addWidget(self.svg)
        self.svg.setFixedSize(70, 60)

Есть ли какой нибудь способ прижать его к нижней части окна в тулбаре?

Ответы

▲ 1Принят

Как вариант:

import sys
from PyQt5.Qt import *


class SvgWidget(QSvgWidget):
    def __init__(self):
        super().__init__()
# установите свое ------> vvvvvvvvvvvvvvvvv 
        self.text = open('radio_checked.svg', 'r')
        self.svg_render = QSvgRenderer(QXmlStreamReader(self.text.read()))
        self.resize(50, 50)

    def paintEvent(self, event) -> None:
        qp = QPainter(self)
        self.svg_render.render(qp)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("2D Map")

        self.widget = QWidget()
        self.setCentralWidget(self.widget)
        
        self.box = QHBoxLayout(self.widget)
        self.box.setContentsMargins(30, 30, 30, 30)
        
        videoAction = QAction(QIcon('im.png'), 'Play Video', self)    # +
        musicAction = QAction(QIcon('Ok.png'), 'Play Song', self)     # +
# установите свое ---------------------> vvvvvvvvv         
        self.testAction = QAction(QIcon('exit_.png'), 'Exit', self)
        self.testAction.triggered.connect(app.quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.setObjectName('toolbar')
        self.addToolBar(Qt.ToolBarArea.LeftToolBarArea, self.toolbar)
        self.toolbar.setMovable(False)
        
        self.toolbar.addAction(videoAction)                           # +
        self.toolbar.addAction(musicAction)                           # +
        self.toolbar.addAction(self.testAction)
        
        # вот здесь:
        self.svg = SvgWidget()
#        self.toolbar.addWidget(self.svg)
        self.svg.setFixedSize(50, 50)

        left_spacer = QWidget()                                       # +++
        self.left_layout = QVBoxLayout(left_spacer)                   # +++

        right_spacer = QFrame()                                       # +
        self.right_layout = QVBoxLayout(right_spacer)                 # +
        right_spacer.setStyleSheet('background-color: #D98C00;')      # +
        
        self.left_layout.addWidget(self.toolbar)                      # +++
        self.left_layout.addWidget(self.svg)                          # +++
        
        self.box.addWidget(left_spacer, 0)                            # +++
        self.box.addWidget(right_spacer, 1)                           # +++

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(800, 600)
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения