Не могу сделать пользовательский QGraphicsItem, получая ObjectType - PullRequest
0 голосов
/ 11 апреля 2019

Может быть, неделю назад я спрашивал о том, как наследовать и создавать пользовательские классы. Как было объяснено, вы должны наследовать от модуля, например, в моем случае это QtWidgets.QGraphicsItem, и вам нужно вызывать его с super или QtWidgets.QGraphicsItem.__init__(self), как это. Я читал об этом некоторым сотрудникам, и недавно я немного поиграл с этим, и он работал, но когда сегодня я попробовал QtWidgets.QGraphicsItemit, это не сработало. Вот мой код:

from PySide2 import QtGui, QtCore, QtWidgets

class testUi(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self)
        self.window = 'vl_test'
        self.title = 'Test Remastered'
        self.size = (1000, 650)

        self.create( )

    def create(self):
        self.setWindowTitle(self.title)
        self.resize(QtCore.QSize(*self.size))
        self.testik = test(self)

        self.mainLayout = QtWidgets.QVBoxLayout( )
        self.mainLayout.addWidget(self.testik)
        self.setLayout(self.mainLayout)


class test(QtWidgets.QGraphicsView):
    zoom_signalA = QtCore.Signal(bool)
    zoom_signalB = QtCore.Signal(bool)
    def __init__(self, parent=None):
        QtWidgets.QGraphicsView.__init__(self)
        self._scene = QtWidgets.QGraphicsScene(backgroundBrush=QtCore.Qt.gray)
        self.__zoom = 0
        self.setScene(self._scene)

        self.graphicsItm = self._scene.addItem(graphicButton)

        self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
        self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(30, 30, 30)))
        self.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding))



    def wheelEvent(self, event):
        if event.angleDelta( ).y( ) > 0:
            factor = 1.25
            self.__zoom += 1
        else:
            factor = 0.8
            self.__zoom -= 1
        self.scale(factor, factor)
        #self.zoom_signalA.emit(self.__zoom < 5)
        #self.zoom_signalB.emit(self.__zoom > 4)


class graphicButton(QtWidgets.QGraphicsItem):
    def __init__(self):
        QtWidgets.QGraphicsItem.__init__(self)
        pixmap = QtGui.QPixmap(r"C:\Users\v.afanasjevs\Desktop\gimpTest\gimpTestButtonPresedA.png")
        pixmap_item = QtWidgets.QGraphicsPixmapItem(pixmap)
        pixmap_item.setFlags(
            pixmap_item.flags( )
            | QtWidgets.QGraphicsItem.ItemIsSelectable
            | QtWidgets.QGraphicsItem.ItemIsMovable
        )

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = testUi()
    window.setGeometry(500, 300, 800, 600)
    window.show()
    sys.exit(app.exec_())

Ошибка:

TypeError: 'PySide2.QtWidgets.QGraphicsScene.addItem' called with wrong argument types:
  PySide2.QtWidgets.QGraphicsScene.addItem(ObjectType)
Supported signatures:
  PySide2.QtWidgets.QGraphicsScene.addItem(PySide2.QtWidgets.QGraphicsItem)

Я предполагаю, что я ошибаюсь, думая, что вы можете сделать все каким-нибудь настраиваемым виджетом, как я делаю здесь, пытаясь сделать QtGui.QPixmap графическим элементом. Если я прав и делаю это неправильно, то как использовать виртуальные функции QGraphicsItem на моей QPixmap? (Я хочу сделать свое изображение кнопкой, поэтому мне нужно использовать «mousePressEvent» и т. Д.). Спасибо за ваше время.

1 Ответ

2 голосов
/ 11 апреля 2019

graphicButton - это имя вашего класса.

Делая это self.graphicsItm = self._scene.addItem(graphicButton), вы передаете класс в качестве параметра.

Измените его на self.graphicsItm = self._scene.addItem(graphicButton()), чтобы создать новый экземпляр.

Ваш graphicButton должен переопределить метод QGraphicsItem::paint.

Но он также может наследоваться от QGraphicsPixmapItem:

class GraphicButton(QtWidgets.QGraphicsPixmapItem):
    def __init__(self):
        pixmap = QtGui.QPixmap(r"img.png")
        QtWidgets.QGraphicsPixmapItem.__init__(self, pixmap)
        self.setFlags(
            self.flags( )
            | QtWidgets.QGraphicsItem.ItemIsSelectable
            | QtWidgets.QGraphicsItem.ItemIsMovable
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...