【问题标题】:Restrict item in PyQt4‏ using itemChange()使用 itemChange() 限制 PyQt4 中的项目
【发布时间】:2016-03-26 13:45:14
【问题描述】:

我尝试使用 Qt 文档 examplerectangle 限制在场景区域,但仍然失败,有人可以这样做吗?

我的代码,QGraphicsView 实例是在 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_())

【问题讨论】:

    标签: qt python-2.7 pyqt


    【解决方案1】:

    第一:

    在您的主要Main() 中使用setSceneRect() 来设置场景的大小。

    第二:

    实际上文档的示例是错误的,因此,要根据场景调整矩形,请删除此if 并在min 中将参数rightbottom 减去矩形尺寸@987654328 @ 和 bottomsetXsetY 中。替换这部分代码:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2018-01-16
      相关资源
      最近更新 更多