如何重新实现QGraphicsPixmapItem的itemChange和mousemoveent?

2024-10-02 16:29:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用PySide做一个T恤设计师。为此,我设置了一个qgraphicscene,将T恤的图像作为现场的QPixmapItem。为了在T恤上覆盖设计,我从用户那里获取设计图像PNG,并将其设置为另一个QPixmapItem。我使用setPos()方法将它们对齐,然后使用setZValue()方法确保设计PNG显示在T恤图像的顶部。你知道吗

我已经为设计图像QPixmapItem启用了ItemIsMovable、ItemIsSelectable、itemssendscenepositionchanges和ItemIsFocusable标志。所以我可以在T恤图片上移动设计。下一步,我想把这种移动限制在可以打印的地方。为了实现这一点,我跟随this question派生了一个新的QGraphicsPixmapItem类,并尝试重新实现itemChange()和mousemovevent()方法。你知道吗

在这些方法中,我尝试使用super()和常规方法调用原始QPixmapItem类的相同方法QGraphicsPixmapItem.itemChange(变化,事件)。然而,似乎什么也没有发生。设计很好,但没有受到限制。为了查看该方法是否被调用,我在这些方法中添加了print语句,但它们没有被执行。你知道吗

我也尝试过在场景中添加setscenestright()。我还在QGraphicsView上启用了setMouseTracking。但是,这些都不会触发itemChanged()或mousemoveent()。你知道吗

还有一些问题,人们在C++中解释了如何做到这一点。但是,我无法在python中复制它。你知道吗

# -*- coding: utf-8 -*-

from PySide import QtCore, QtGui
from os import path

class Pixmap(QtGui.QGraphicsPixmapItem):

    def __init__(self, pix):
        super(Pixmap, self).__init__()
        self.pixmap_item = QtGui.QGraphicsPixmapItem(pix)
        self.pixmap_item.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        self.pixmap_item.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
        self.pixmap_item.setFlag(QtGui.QGraphicsItem.ItemSendsScenePositionChanges, True)
        self.pixmap_item.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True)

    def itemChange(self, change, event):
        QtGui.QGraphicsPixmapItem.itemChange(change, event)
        print "Item Changed"
        #Code to restrict to a rectangular area goes here
        return QtGui.QGraphicsPixmapItem.itemChange(self, change, event)

    def mouseMoveEvent(self, event):
        super(Pixmap, self).mouseMoveEvent(event)
        print "Mouse Moved"
        #Code to restrict to a rectangular area goes here

class Ui_frmSelectRoundNeckHalfSleeve(QtCore.QObject):

    def setupUi(self, frmSelectRoundNeckHalfSleeve):
        frmSelectRoundNeckHalfSleeve.setObjectName("frmSelectRoundNeckHalfSleeve")
        frmSelectRoundNeckHalfSleeve.resize(842, 595)
        self.imgRoundNeckTShirt = QtGui.QGraphicsView(frmSelectRoundNeckHalfSleeve)
        self.imgRoundNeckTShirt.setGeometry(QtCore.QRect(20, 20, 500, 500))
        self.imgRoundNeckTShirt.setObjectName("imgRoundNeckTShirt")
        self.imgRoundNeckTShirt.setMouseTracking(True)

        self.tShirtScene = QtGui.QGraphicsScene(frmSelectRoundNeckHalfSleeve)
        self.tShirtScene.setSceneRect(20, 20, 480, 480)
        self.TShirtImage = QtGui.QGraphicsPixmapItem(QtGui.QPixmap("./Images/black-t-shirt.jpg").scaled(480, 480, QtCore.Qt.KeepAspectRatio))
        self.designImagePixmap = QtGui.QPixmap("./Designs/test.png")
        self.designImagePng = Pixmap(self.designImagePixmap.scaledToWidth(135,QtCore.Qt.SmoothTransformation))
        self.TShirtImage.setZValue(10)
        self.designImagePng.pixmap_item.setZValue(40)
        self.designImagePng.pixmap_item.setPos(167,90)
        self.tShirtScene.addItem(self.TShirtImage)
        self.tShirtScene.addItem(self.designImagePng.pixmap_item)
        self.imgRoundNeckTShirt.setScene(self.tShirtScene)

if __name__ == "__main__":

    path = r"E:\\Documents\\T Shirt Designer\\"
    QtGui.QApplication.addLibraryPath(path)

    app = QtGui.QApplication(sys.argv)
    testFile = QtGui.QWidget()
    ui = Ui_frmSelectRoundNeckHalfSleeve()
    ui.setupUi(testFile)

    testFile.show()
    sys.exit(app.exec_())

Tags: 方法图像selfeventtrueitemqtguiqtcore
1条回答
网友
1楼 · 发布于 2024-10-02 16:29:29

错误是您没有覆盖pixmap\u item itemChange,而是覆盖了一个pixmap。看来你把继承和写作混为一谈了。你知道吗

一个改进是基本项(T恤)是设计项的父项,因此设计项的坐标相对于基本项。你知道吗

考虑到前面的事情,我已经实现了将设计项的移动限制到T恤项空间的逻辑。你知道吗

# -*- coding: utf-8 -*-

import sys
from os import path
from PySide import QtCore, QtGui


class Pixmap(QtGui.QGraphicsPixmapItem):
    def __init__(self, pix, parent=None):
        super(Pixmap, self).__init__(pix, parent)
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
        self.setFlag(QtGui.QGraphicsItem.ItemSendsScenePositionChanges, True)
        self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True)

    def itemChange(self, change, value):
        if change == QtGui.QGraphicsItem.ItemPositionChange:
            parent = self.parentItem()
            if parent is not None:
                r = self.mapToParent(self.boundingRect()).boundingRect()
                R = parent.boundingRect()
                rR = QtCore.QRectF(R.topLeft(), R.size() - r.size())
                if not rR.contains(value):
                    x = min(max(rR.left(), value.x()), rR.right())
                    y = min(max(rR.top(), value.y()), rR.bottom())
                    return QtCore.QPointF(x, y)
        return QtGui.QGraphicsPixmapItem.itemChange(self, change, value)


class Ui_frmSelectRoundNeckHalfSleeve(QtCore.QObject):
    def setupUi(self, frmSelectRoundNeckHalfSleeve):
        frmSelectRoundNeckHalfSleeve.setObjectName(
            "frmSelectRoundNeckHalfSleeve"
        )
        frmSelectRoundNeckHalfSleeve.resize(842, 595)
        self.imgRoundNeckTShirt = QtGui.QGraphicsView(
            frmSelectRoundNeckHalfSleeve
        )
        self.imgRoundNeckTShirt.setGeometry(QtCore.QRect(20, 20, 500, 500))
        self.imgRoundNeckTShirt.setObjectName("imgRoundNeckTShirt")

        self.tShirtScene = QtGui.QGraphicsScene(frmSelectRoundNeckHalfSleeve)
        self.tShirtScene.setSceneRect(20, 20, 480, 480)
        self.TShirtImage = QtGui.QGraphicsPixmapItem(
            QtGui.QPixmap("./Images/black-t-shirt.jpg").scaled(
                480, 480, QtCore.Qt.KeepAspectRatio
            )
        )
        designImagePixmap = QtGui.QPixmap("./Designs/test.png").scaledToWidth(
            135, QtCore.Qt.SmoothTransformation
        )
        self.designImagePng = Pixmap(designImagePixmap, self.TShirtImage)
        self.designImagePng.setZValue(1)
        self.designImagePng.setPos(167, 90)
        self.tShirtScene.addItem(self.TShirtImage)
        self.imgRoundNeckTShirt.setScene(self.tShirtScene)


if __name__ == "__main__":

    path = r"E:\\Documents\\T Shirt Designer\\"
    QtGui.QApplication.addLibraryPath(path)
    app = QtGui.QApplication(sys.argv)
    testFile = QtGui.QWidget()
    ui = Ui_frmSelectRoundNeckHalfSleeve()
    ui.setupUi(testFile)
    testFile.show()
    sys.exit(app.exec_())

相关问题 更多 >