带有 QGraphicsWidget 的 pyside2 应用程序立即关闭
pyside2 app with QGraphicsWidget is closing immediately
在我的项目(策划游戏)中,我特别需要使用 Graphics View Framework,因为我想管理一个带有棋子的图形游戏,棋子可以通过拖放移动。
我设法显示 window 但 GraphicsWidget 中没有任何内容:
outrun.py
#!/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
的工作方式:此 class 用于将小部件嵌入 QGraphicsScene
。
您应该重新考虑构建 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_())
顺便说一句,您的 window 立即关闭,因为没有可显示的小部件(view
在您的构造函数末尾被销毁)。
我曾经在需要使用 Graphics View Framework 时为具有所有主要功能的最小 GUI 制作了一个 Pyside2 框架。您可以在 my Github page
找到它
它包含视图、场景、图形项并具有鼠标和键控制功能。这应该作为一个良好的开端或作为实施一些 类 和图形视图框架相关方法的示例。
在我的项目(策划游戏)中,我特别需要使用 Graphics View Framework,因为我想管理一个带有棋子的图形游戏,棋子可以通过拖放移动。
我设法显示 window 但 GraphicsWidget 中没有任何内容:
outrun.py
#!/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
的工作方式:此 class 用于将小部件嵌入 QGraphicsScene
。
您应该重新考虑构建 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_())
顺便说一句,您的 window 立即关闭,因为没有可显示的小部件(view
在您的构造函数末尾被销毁)。
我曾经在需要使用 Graphics View Framework 时为具有所有主要功能的最小 GUI 制作了一个 Pyside2 框架。您可以在 my Github page
找到它它包含视图、场景、图形项并具有鼠标和键控制功能。这应该作为一个良好的开端或作为实施一些 类 和图形视图框架相关方法的示例。