使用 itemChange() 限制 PyQt4 中的项目 [英] Restrict item in PyQt4‏ using itemChange()

查看:39
本文介绍了使用 itemChange() 限制 PyQt4 中的项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用 Qt 文档 example 来限制 矩形到场景区域但仍然失败,有人有替代方法吗?

I tried using the Qt documentation example to restrict the rectangle to the area of the scene but it still fails, someone has an alternative to do this?

我的代码,QGraphicsView 实例是在 Qt Desginer 中创建的:

My code, the QGraphicsView instance was created in Qt Desginer:

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

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
from screen import *

class MovableItem(QGraphicsRectItem):
    def __init__(self, rectang, *args, **kwargs):
        QGraphicsRectItem.__init__(self, rectang, *args, **kwargs)
        self.setFlags(QGraphicsItem.ItemIsMovable |
                  QGraphicsItem.ItemSendsGeometryChanges)

        self.pen = QPen(Qt.darkMagenta)
        self.pen.setWidth(4)

        self.setPen(self.pen)

    def itemChange(self, change, value):
        if change == QGraphicsItem.ItemPositionChange and self.scene():
            # value is the new position.
            self.newPos = value.toPointF()
            self.rect = self.scene().sceneRect()

            if not(self.rect.contains(self.newPos)):
            # Keep the item inside the scene rect.
                self.newPos.setX(min(self.rect.right(), max(self.newPos.x(), self.rect.left())))
                self.newPos.setY(min(self.rect.bottom(), max(self.newPos.y(), self.rect.top())))

                return self.newPos

        return QGraphicsRectItem.itemChange(self, change, value)


class Main(QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)

        self.scene = QGraphicsScene()
        self.cena.setScene(self.scene)
        self.scene.addPixmap(QPixmap("01.png"))

        self. graph = MovableItem(2, 2, 300, 150)

        self.scene.addItem(self.graph)

    def showEvent(self, event):
        self.cena.fitInView(self.scene.sceneRect(), Qt.IgnoreAspectRatio)


app = QApplication(sys.argv)
window = Main()
window.show()

sys.exit(app.exec_())

推荐答案

第一:

使用setSceneRect() 在你的主 Main() 中,设置场景的大小.

Use setSceneRect() in your main Main(), to set the size of the scene.

第二:

实际上文档的例子是错误的,因此,要根据场景调整矩形,删除此if并减去min中的参数setXsetY<中的矩形尺寸 rightbottom 的右bottom/代码>.替换这部分代码:

Actually the example of the documentation is wrong, therefore, to adjust the rectangle to the scene, delete this if and subtract, in min, the parameters right and bottom by the rectangle dimensions right and bottom in setX and setY. Replace this part of your code:

if not(self.rect.contains(self.newPos)):
# Keep the item inside the scene rect.
    self.newPos.setX(min(self.rect.right(), max(self.newPos.x(), self.rect.left())))
    self.newPos.setY(min(self.rect.bottom(), max(self.newPos.y(), self.rect.top())))

    return self.newPos

对于:

self.newPos.setX(min(self.rect.right()-self.boundingRect().right(), max(self.newPos.x(), self.rect.left())))
self.newPos.setY(min(self.rect.bottom()-self.boundingRect().bottom(), max(self.newPos.y(), self.rect.top())))

return self.newPos

这篇关于使用 itemChange() 限制 PyQt4 中的项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆