Python 带有QGraphicsWidget的pyside2应用程序将立即关闭

Python 带有QGraphicsWidget的pyside2应用程序将立即关闭,python,qgraphicsscene,pyside2,Python,Qgraphicsscene,Pyside2,在我的项目(一个智囊团游戏)中,我特别需要使用图形视图框架,因为我想管理一个带有通过拖放移动的棋子的图形游戏 我管理显示窗口,但GraphicsWidget中没有任何内容: 超量 #!/usr/bin/python from PySide2 import QtGui, QtWidgets as wids import sys import out import PySide2 class ImageViewer(wids.QMainWindow, out.Ui_MainWindow):

在我的项目(一个智囊团游戏)中,我特别需要使用图形视图框架,因为我想管理一个带有通过拖放移动的棋子的图形游戏

我管理显示窗口,但GraphicsWidget中没有任何内容:

超量

#!/usr/bin/python

from PySide2 import QtGui, QtWidgets as wids
import sys
import out
import PySide2

class ImageViewer(wids.QMainWindow, out.Ui_MainWindow):
    def __init__(self, parent=None):
        super(ImageViewer, self).__init__(parent)
        self.setupUi(self)

    def main(self):
        self.changeGraphicsView()
        self.show()

    def changeGraphicsView(self):
        scene=wids.QGraphicsScene() 
        self.graphicsView.setScene(scene)

        windowLayout=wids.QGraphicsGridLayout()

        title0=wids.QGraphicsSimpleTextItem()
        title0.setText("JEU DE MASTERMIND")
        title=wids.QGraphicsWidget(title0)
        windowLayout.addItem(title,0,0)

        title1=wids.QGraphicsSimpleTextItem()
        title1.setText("super!")
        title2=wids.QGraphicsWidget(title1)
        windowLayout.addItem(title2,0,1)

        form=wids.QGraphicsWidget()
        form.setLayout(windowLayout)
        scene.addItem(form)

        self.graphicsView.show()


if __name__=='__main__':
    app = wids.QApplication(sys.argv)
    imageViewer = ImageViewer()
    imageViewer.main()
    app.exec_()
和out.py(从.ui文件): 唯一有趣的是“self.graphicsView”字段,它在上面的代码中使用

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(10, 100, 761, 441))
        brush = QtGui.QBrush(QtGui.QColor(107, 197, 190))
        brush.setStyle(QtCore.Qt.NoBrush)
        self.graphicsView.setBackgroundBrush(brush)
        self.graphicsView.setObjectName("graphicsView")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 20, 781, 51))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily("Mongolian Baiti")
        font.setPointSize(28)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "MainWindow", None, -1))
        self.label.setText(QtWidgets.QApplication.translate("MainWindow", "HELLO QT !", None, -1))

谢谢。

这不是
QGraphicsWidget
的工作原理:此类用于将小部件嵌入
qgraphicscene

您应该重新考虑构建UI的方式(不必在场景中嵌入所有内容)

以下是您应该如何使用它:

class Display(QGraphicsWidget):
    def __init__(self):
        QGraphicsWidget.__init__(self)
        #création du layout
        self.layout= QGraphicsGridLayout()
        self.setLayout(self.layout)
        self.layout.setRowMinimumHeight(1,400)
        self.layout.setColumnMinimumWidth(0,250)

        #ajout des composants
        title0= QGraphicsSimpleTextItem(self)
        title0.setText("JEU DE MASTERMIND")
        title0.setFont(QFont("Times",20,QFont.ExtraExpanded|QFont.ExtraBold))
        title= QGraphicsWidget(title0)
        self.layout.addItem(title,0,0,1,2)

        title02= QGraphicsSimpleTextItem(self)
        title02.setText("haha")
        title2= QGraphicsWidget(title02)
        self.layout.addItem(title2,1,0,1,1)

import sys

if __name__ == '__main__':
    app =  QApplication(sys.argv)
    window=Display()

    # Create a view and its scene
    scene= QGraphicsScene()
    view= QGraphicsView(scene)

    # Insert your Display item in the view
    scene.addItem(window)
    view.show()
    sys.exit(app.exec_())

顺便说一句,您的窗口会立即关闭,因为没有要显示的小部件(在构造函数结束时,
视图
被销毁)。

这不是
QGraphicsWidget
的工作方式:此类用于将小部件嵌入
qgraphicscene

您应该重新考虑构建UI的方式(不必在场景中嵌入所有内容)

以下是您应该如何使用它:

class Display(QGraphicsWidget):
    def __init__(self):
        QGraphicsWidget.__init__(self)
        #création du layout
        self.layout= QGraphicsGridLayout()
        self.setLayout(self.layout)
        self.layout.setRowMinimumHeight(1,400)
        self.layout.setColumnMinimumWidth(0,250)

        #ajout des composants
        title0= QGraphicsSimpleTextItem(self)
        title0.setText("JEU DE MASTERMIND")
        title0.setFont(QFont("Times",20,QFont.ExtraExpanded|QFont.ExtraBold))
        title= QGraphicsWidget(title0)
        self.layout.addItem(title,0,0,1,2)

        title02= QGraphicsSimpleTextItem(self)
        title02.setText("haha")
        title2= QGraphicsWidget(title02)
        self.layout.addItem(title2,1,0,1,1)

import sys

if __name__ == '__main__':
    app =  QApplication(sys.argv)
    window=Display()

    # Create a view and its scene
    scene= QGraphicsScene()
    view= QGraphicsView(scene)

    # Insert your Display item in the view
    scene.addItem(window)
    view.show()
    sys.exit(app.exec_())

顺便说一句,您的窗口会立即关闭,因为没有可显示的小部件(在构造函数结束时,
视图被销毁)。

我曾经为一个小型GUI制作了一个Pyside2框架,当需要使用图形视图框架时,它具有所有主要功能。你可以在


它包含一个视图、一个场景、图形项目,并具有鼠标和按键控制功能。这应该是一个很好的开始,或者作为一些类和方法在图形视图框架中实现的示例。

我曾经为minmimal GUI制作了一个Pyside2框架,当需要使用图形视图框架时,它具有所有的主要功能。你可以在


它包含一个视图、一个场景、图形项目,并具有鼠标和按键控制功能。这应该是一个很好的开始,或者作为一些类和方法在图形视图框架中实现的示例。

谢谢您的回答。还有一个问题:QGraphicsGridLayout似乎不起作用:这两个文本没有彼此分开显示。此外,我希望有一个场景,以便管理我的游戏的图形元素。你认为我可以在我的QGraphicsWidget中添加几个QGraphicscene/QGraphicsView吗?我将结束这个问题,因为现在的问题不同了,所以我创建了一个新问题。谢谢你的回答。还有一个问题:QGraphicsGridLayout似乎不起作用:这两个文本没有彼此分开显示。此外,我希望有一个场景,以便管理我的游戏的图形元素。你认为我可以在我的QGraphicsWidget中添加几个QGraphicscene/QGraphicsView吗?我将结束这个问题,因为现在的问题不同了,所以我创建了一个新问题。谢谢