Как центрировать виджеты на сцене QGraphicsScene - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу выровнять сцену посередине.Моя проблема в том, что когда вы открываете приложение, виджеты выравниваются как-то ниже середины, но после наведения курсора на кнопки или метку виджеты выравниваются посередине.Можно как-нибудь это исправить?Есть ли правильный способ выровнять сцену по центру вида?

Вот весь код моего приложения:

import sys
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setFixedSize(QSize(1080, 720))
        self.setWindowTitle('Graphics Scene')
        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)

        self.mainview = QGraphicsView(self.centralwidget)
        self.mainview.setGeometry(QRect(0, 0, 1080, 720))

        alignment = Qt.Alignment(Qt.AlignVCenter, Qt.AlignHCenter)
        self.mainview.setAlignment(alignment)

        # Main Scene (1)
        self.mainScene = QGraphicsScene()
        self.mainview.setScene(self.mainScene)

        self.labelTitle = QLabel('Main Scene')
        self.labelTitle.setStyleSheet('''
            QLabel {
                font: 48px 'Calibri';
                color: #999;
            }
        ''')

        styleForButtons = ('''
            QPushButton {
                margin: 0 70px;
                padding: 5px 30px;
            }
        ''')

        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
        self.buttonPlay = QPushButton('Play')
        self.buttonSettings = QPushButton('Settings')
        self.buttonCredits = QPushButton('Credits')
        self.buttonMainExit = QPushButton('Exit')

        self.buttonPlay.setStyleSheet(styleForButtons)
        self.buttonSettings.setStyleSheet(styleForButtons)
        self.buttonCredits.setStyleSheet(styleForButtons)
        self.buttonMainExit.setStyleSheet(styleForButtons)

        self.buttonPlay.setSizePolicy(sizePolicy)
        self.buttonSettings.setSizePolicy(sizePolicy)
        self.buttonCredits.setSizePolicy(sizePolicy)
        self.buttonMainExit.setSizePolicy(sizePolicy)

        self.itemLabelTitle = self.mainScene.addWidget(self.labelTitle)
        self.itemButtonPlay = self.mainScene.addWidget(self.buttonPlay)
        self.itemButtonSettings = self.mainScene.addWidget(self.buttonSettings)
        self.itemButtonCredits = self.mainScene.addWidget(self.buttonCredits)
        self.itemButtonMainExit = self.mainScene.addWidget(self.buttonMainExit)

        self.mainMenuLayout = QGraphicsGridLayout()

        self.mainMenuLayout.addItem(self.itemLabelTitle, 0, 0, alignment)
        self.mainMenuLayout.addItem(self.itemButtonPlay, 1, 0)
        self.mainMenuLayout.addItem(self.itemButtonSettings, 2, 0)
        self.mainMenuLayout.addItem(self.itemButtonCredits, 3, 0)
        self.mainMenuLayout.addItem(self.itemButtonMainExit, 4, 0)

        self.mainMenuWidget = QGraphicsWidget()
        self.mainMenuWidget.setLayout(self.mainMenuLayout)
        self.mainScene.addItem(self.mainMenuWidget)

def main():
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

UPD: загруженные скриншоты того, что ясм.

enter image description here

Я хочу понять, почему мое приложение ведет себя так странно: во-первых, почему виджеты не выровнены точно по центру, во-вторых, почему тамэто смена

1 Ответ

0 голосов
/ 17 декабря 2018

Проблема вызвана тем, что для сцены не задано значение sceneRect(), поэтому при отображении QGraphicsView он устанавливает размер сцены, используя разрешение экрана в качестве основы, поэтому изначально он может иметь размерboundingRect() всех элементов, центрированных относительно этого размера, а не относительно части сцены, показанной в viewport(), сразу после прохождения сцены мышью методом update()и обновляется до нужного размера.Поэтому одним из решений является установка sceneRect() с использованием размера виджета в координатах сцены.

self.mainScene.setSceneRect(QRectF(QPointF(), self.mainMenuWidget.sizeHint(Qt.PreferredSize))) 
self.mainScene.addItem(self.mainMenuWidget)
...