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

时间:2019-04-11 07:45:04

标签: python pyqt

也许一周前,我在问如何继承和创建自定义类。如前所述,您必须从模块继承,例如,在我的情况下,它是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”等)。  谢谢您的宝贵时间。

1 个答案:

答案 0 :(得分: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
        )