如何在场景 QGraphicsScene 上居中小部件

3

我想把场景居中对齐。我的问题是,当打开应用程序时,小部件会在某种程度上向下对齐,但在悬停在按钮或标签上后,小部件会居中对齐。有没有什么方法可以解决这个问题?是否有正确的方法来将场景居中对齐于视图中?

这是我应用程序的全部代码:

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()
更新:上传了我所看到的截图。
我想要理解为什么我的应用程序表现得如此奇怪:首先,为什么小部件没有完全对齐在中心位置,其次,为什么会有偏移。

@eyllanesc,我认为,如果您在计算机上运行此代码,应用程序将以与我相同的方式行动:小部件在任何操作(悬停,按键)后向上移动。 - MalcoreHardcore698
@eyllanesc pyside2 5.11.2 - MalcoreHardcore698
@eyllanesc,是的,它已经起作用了。PySide2.QtCore.QRectF(0.000000,0.000000,259.000000,201.000000)。还有,为什么会这样?为什么它能够工作? - MalcoreHardcore698
我会发布一个答案,说明原因。 - eyllanesc
我已经发布了一个解释问题原因的答案,通常是由于未建立sceneRect而引起的,因此Qt内部尝试计算适当的sceneRect但未能生成意外行为,因此解决方案是使用小部件的首选大小来建立它。 - eyllanesc
显示剩余5条评论
1个回答

2
问题的原因是场景没有设置sceneRect()。当QGraphicsView显示时,它使用屏幕分辨率作为基础来设置场景的大小,使其最初的大小为所有项目的boundingRect(),从而使其相对于该大小居中,而不是相对于在viewport()中显示的场景部分。在鼠标经过场景后,将调用update()方法并更新到正确的大小。因此,一种解决方案是使用场景坐标中部件的大小来设置sceneRect()
self.mainScene.setSceneRect(QRectF(QPointF(), self.mainMenuWidget.sizeHint(Qt.PreferredSize))) 
self.mainScene.addItem(self.mainMenuWidget)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接