无法制作自定义QGraphicsItem,获取ObjectType

问题描述 投票:0回答:1

也许一周前我问的是如何继承和制作自定义类。正如所解释的那样,你必须继承模块,例如在我的情况下,它是QtWidgets.QGraphicsItem,你需要像这样用superQtWidgets.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成为一个图形项目。如果,我是对的,我做错了,那么如何在我的QPixmap上使用QGraphicsItem的虚函数? (我想让我的图像成为一个按钮,所以我想我必须使用“mousePressEvent”等)。感谢您的时间。

python pyqt
1个回答
2
投票

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
        )
© www.soinside.com 2019 - 2024. All rights reserved.