QGraphicsGridLayout без эффекта: все компоненты находятся в одном и том же месте

#python #qt #pyqt #qgraphicsview #pyside2

#python #qt #pyqt #qgraphicsview #pyside2

Вопрос:

Я пытаюсь изучить PySide2 и пытаюсь смешивать обычные компоненты с некоторыми из фреймворков для просмотра графики.

Проблема в том, что 2 QGraphicsSimpleTextItems отображаются без учета требований QGraphicsGridLayout : оба находятся в одном и том же месте (поэтому полученный текст не читается).

вот мой маленький автономный код:

 # coding: utf-8

from PySide2 import QtCore as core, QtWidgets as wids, QtGui as gui
import sys

class Display(wids.QMainWindow):

    def __init__(self):
        wids.QMainWindow.__init__(self)
        self.changeGraphics()

    def changeGraphics(self):
        self.resize(500, 500)

        #au top : un QWidget
        self.central_widget = wids.QWidget(self)
        self.central_layout = wids.QHBoxLayout()
        self.central_widget.setLayout(self.central_layout)
        self.setCentralWidget(self.central_widget)

        self.label = wids.QLabel(self.central_widget)
        self.label.setText('Ca marche')
        self.central_layout.addWidget(self.label)

        #on ajoute le nécessaire graphique
        self.view = wids.QGraphicsView()
        self.scene = wids.QGraphicsScene()
        self.view.setScene(self.scene)
        self.central_layout.addWidget(self.view)


        #il faut disposer les éléments dans la scène par un QGraphicsGridLayout
        ##panel=conteneur général d'éléments graphiques
        panel = wids.QGraphicsWidget()
        self.scene.addItem(panel)
        layout = wids.QGraphicsGridLayout()
        panel.setLayout(layout)

        #au layout, on ajoute un élément graphique
        title0=wids.QGraphicsSimpleTextItem(panel)
        title0.setText("JEU DE MASTERMIND")
        title=wids.QGraphicsWidget(title0)
        layout.addItem(title,0,0)

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


if __name__ == "__main__":
    app = wids.QApplication(sys.argv)
    display=Display()
    display.show()
    display.changeGraphics()
    sys.exit(app.exec_())
  

спасибо.ll

Ответ №1:

Попробуйте:

 import sys
from PyQt5 import QtCore as core, QtWidgets as wids, QtGui as gui

class Display(wids.QMainWindow):
    def __init__(self):
        super().__init__()

        self.changeGraphics()

    def changeGraphics(self):
        self.resize(500, 500)
        #au top : un QWidget
        self.central_widget = wids.QWidget(self)
        self.central_layout = wids.QHBoxLayout()
        self.central_widget.setLayout(self.central_layout)
        self.setCentralWidget(self.central_widget)

        self.label = wids.QLabel(self.central_widget)
        self.label.setText('Ca marche')
        self.central_layout.addWidget(self.label)

        #on ajoute le nécessaire graphique
        self.view  = wids.QGraphicsView()
        self.scene = wids.QGraphicsScene()
        self.view.setScene(self.scene)
        self.central_layout.addWidget(self.view)

#     vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        self.labelTitle0 = wids.QLabel('JEU DE MASTERMIND')
        self.labelTitle1 = wids.QLabel('super!')
        self.itemLabelTitle0 = self.scene.addWidget(self.labelTitle0)
        self.itemLabelTitle1 = self.scene.addWidget(self.labelTitle1)

        layout = wids.QGraphicsGridLayout()
        layout.addItem(self.itemLabelTitle0, 0, 0)
        layout.addItem(self.itemLabelTitle1, 1, 0)

        self.panelWidget = wids.QGraphicsWidget()
        self.panelWidget.setLayout(layout)

        self.scene.addItem(self.panelWidget)        
#     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        


if __name__ == "__main__":
    app = wids.QApplication(sys.argv)
    display = Display()
    display.show()
#    display.changeGraphics()
    sys.exit(app.exec_())
  

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

Комментарии:

1. хорошо, это работает … но я думаю, что это очень сложно, поскольку в QGraphicsView QLabels добавляются в сцену дважды каждый: один раз напрямую, а другой раз косвенно : через переменные itemLabelTitlex, которые добавляются в QGraphicsGridLayout, который управляет позиционированием panelWidget, которое, в свою очередь, добавляется в сцену…

Ответ №2:

Это не то, как QGraphicsLayout и QGraphicsWidget работают.

Эта строка title=wids.QGraphicsWidget(title0) не встраивает QGraphicsItem в QGraphicsWidget , а создает новый объект с title0 родительским значением.

Если вы хотите поместить QGraphicsItem в QGraphicsLayout (который создан для QGraphicsWidget ), вы должны:

  • Создайте новый класс, который наследует от QGraphicsLayoutItem и QGraphicsItem .
  • Реализуйте абстрактные методы

В документации Qt есть пример