调整大小后 QRubberBand 在 QGraphicsView 上移动

2023-12-05

我在这个主题中遇到了同样的问题:当我调整窗口大小时 QRubberBand 移动,经过几次尝试,我意识到本主题的解决方案不适用于 QGraphics 视图。当我调整窗口大小时,为什么我的选择会围绕 QgraphicsView 移动。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
# from PyQt4 import QtCore, QtWidgets

class ResizableRubberBand(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(ResizableRubberBand, self).__init__(parent)
        self.draggable = False
        self.mousePressPos = None
        self.mouseMovePos = None
        self._band = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self)
        self._band.setGeometry(550, 550, 550, 550)
        self._band.show()
        self.show()

    def mousePressEvent(self, event):
            if event.button() == QtCore.Qt.RightButton:
                self.mousePressPos = event.globalPos()                # global
                self.mouseMovePos = event.globalPos() - self.pos()    # local
                self.draggable = True
            elif event.button() == QtCore.Qt.LeftButton:
                self.position = QtCore.QPoint(event.pos())
                self.upper_left = self.position
                self.lower_right = self.position
                self.mode = "drag_lower_right"
                self._band.show()

    def mouseMoveEvent(self, event):
        if self.draggable and event.buttons() & QtCore.Qt.RightButton:
            globalPos = event.globalPos()
            print(globalPos)
            diff = globalPos - self.mouseMovePos
            self.move(diff)
            self.mouseMovePos = globalPos - self.pos()
        elif self._band.isVisible():
            # visible selection
            if self.mode is "drag_lower_right":
                self.lower_right = QtCore.QPoint(event.pos())
                # print(str(self.lower_right))
            elif self.mode is "drag_upper_left":
                self.upper_left = QtCore.QPoint(event.pos())
                # print(str(self.upper_left))
            # update geometry
            self._band.setGeometry(QtCore.QRect(self.upper_left, self.lower_right).normalized())

    def mouseReleaseEvent(self, event):
        self.draggable = False

我的主要课程:

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.band = ResizableRubberBand()
        scene = QtWidgets.QGraphicsScene(self)
        photo = QtGui.QPixmap('image.jpg')
        scene.addPixmap(photo)
        self.band.setScene(scene)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.band)



if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(800, 100, 600, 500)
    window.show()
    sys.exit(app.exec_())

调整大小之前:

enter image description here

调整大小后:

enter image description here


该问题的产生是因为图像的坐标系与QRubberBand的坐标系不一样。所以解决方案是你们共享相同的坐标系,为此我们将 QRubberBand 添加到场景中。

from PyQt5 import QtCore, QtGui, QtWidgets


class GraphicsView(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(GraphicsView, self).__init__(parent)
        self.setScene(QtWidgets.QGraphicsScene(self))
        self.m_rubberBand = QtWidgets.QRubberBand(
            QtWidgets.QRubberBand.Rectangle
        )
        self.m_rubberBand.setGeometry(QtCore.QRect(-1, -1, 2, 2))
        self.m_rubberBand.hide()
        item = self.scene().addWidget(self.m_rubberBand)
        item.setZValue(1)
        self.m_draggable = False

        self.m_origin = QtCore.QPoint()

    def mousePressEvent(self, event):
        self.m_origin = self.mapToScene(event.pos()).toPoint()

        self.m_rubberBand.setGeometry(
            QtCore.QRect(self.m_origin, QtCore.QSize())
        )
        self.m_rubberBand.show()

        self.m_draggable = True
        super(GraphicsView, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if self.m_draggable:
            end_pos = self.mapToScene(event.pos()).toPoint()
            self.m_rubberBand.setGeometry(
                QtCore.QRect(self.m_origin, end_pos).normalized()
            )
            self.m_rubberBand.show()

    def mouseReleaseEvent(self, event):
        end_pos = self.mapToScene(event.pos()).toPoint()
        self.m_rubberBand.setGeometry(
            QtCore.QRect(self.m_origin, end_pos).normalized()
        )
        self.m_draggable = False


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = GraphicsView()
    photo = QtGui.QPixmap("image.jpg")
    w.scene().addPixmap(photo)
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

enter image description here

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整大小后 QRubberBand 在 QGraphicsView 上移动 的相关文章

随机推荐

  • 对工作日文本进行排序

    我有清单 Tue Wed Mon Thu Fri 作为列表 我想将其设为 Mon Tue Wed Thu Fri 这个该如何排序呢 效率不是很高 但是如果你有一个它们应该排列的顺序列表 gt gt gt m Mon Tue Wed Thu
  • 底图形状文件可视化

    使用 Basemap 创建一些地图后 我变得热情起来 我想集成shapefile信息 比如说一个多边形 但是有一些问题 我在这里下载了巴伐利亚村庄的边界 https www arcgis com home item html id b752
  • 当对数组调用此 .pop 方法时,为什么我会得到意外的 .length 结果

    我是 JS 新手 所以请耐心等待 当我试图打电话给 pop数组上的方法定义为secretMessage 它有 24 个元素 我使用了语法secretMessage secretMessage pop 我相信这是错误的 呼叫 length m
  • PHP 中的关联数组中有类似 keypath 的东西吗?

    我想剖析这样的数组 ID UUID pushNotifications sent campaigns boundDate campaigns endDate campaigns pushMessages sentDate pushNotif
  • 错误:无法从字典转换为 IDictionary

    为什么会出现错误 错误 52 参数 1 无法从 System Collections Generic Dictionary gt 转换为 System Collections Generic IDictionary gt Dictionar
  • 将字符串列表转换为 int

    我有一个要转换为 int 的字符串列表 或者从一开始就有 int 任务是从文本中提取数字 并得出总和 我所做的是这样的 for line in handle line line rstrip z re findall d line if l
  • RISC 架构中小数的直接算术运算

    是否有任何 RISC 架构允许算术运算单独应用于字节 半字和其他数据单元 其大小小于 CPU 通用寄存器的大小 在 Intel x86 IA 32 和 x86 64 称为 EM64T 或 AMD64 处理器中 不仅整个寄存器可用 而且其较小
  • 使用具有单个 DbContext 和实体的多个数据库并在运行时生成连接字符串

    我正在开发一个 MVC 5 应用程序 最初 我使用单一数据库和 EF6 数据库第一种方法 并使用 DbContext 实例来访问包含 102 个表的数据库 我将其实例声明为 私有 MyEntities db new MyEntities 现
  • 使用 Application.WorksheetFunction.Trim 修剪一系列单元格

    我正在尝试使用修剪一系列单元格Application WorksheetFunction Trim 我正在尝试定义我的范围 但出现类型不匹配错误 我创建了 Dim 并设置了范围并为该函数创建了一个变量 Dim rng As Range Di
  • Scalaz 管道运算符与列表方法连接

    我是新手Scala 但我有一些使用经验OCaml 我正在考虑采用中定义的管道运算符Scalaz通过以下方式 import scalaz import Scalaz def test def length2 x String List x l
  • 保存与 Cakephp 3 的关联

    我在使用 CakePHP 3 和通过一项操作保存新实体及其关联时遇到问题 在我看来 我按照文档中的建议进行操作 这是我的控制器 articles TableRegistry get Articles article articles gt
  • AngularJS 中指令隔离范围与 ng-repeat 范围

    我有一个带有隔离范围的指令 以便我可以在其他地方重用该指令 并且当我将此指令与ng repeat 它无法工作 我已阅读有关此主题的所有文档和 Stack Overflow 答案并了解这些问题 我相信我已经避免了所有常见的问题 所以我知道我的
  • jQuery .each 在 Safari 上比 Chrome/Firefox 慢

    我有一个大型 HTML 表格 1 000 1 500 行 40 列宽 我有一些输入和选择框 以便用户可以过滤行 附加的相关 javascript jquery 注意 没有粘贴整个代码库 因为它不是瓶颈 如下所示 function autoR
  • 错误:文档未定义,在构建角度通用应用程序时

    Error factory require jquery document window navigator ReferenceError document is not defined 面对角度通用渲染服务器端的问题 我用谷歌搜索了这个并
  • 如何理解UML中类似自反关联的“自反聚合”关系

    这个类图是什么意思 自反关联的类图使用了实线和箭头 但这里用空心菱形代替 和递归有关系吗 这个类图会生成什么 如果能举个例子就最好了 另外这个递归关系应该是一对多 如果存储数据库怎么建表 这是什么意思 这个类图意味着Unit can与其他几
  • 如何保持Python脚本输出窗口打开?

    我刚刚开始使用Python 当我在 Windows 上执行 python 脚本文件时 输出窗口出现但立即消失 我需要它留在那里 以便我可以分析我的输出 我怎样才能保持它打开 您有几个选择 从已打开的终端运行该程序 打开命令提示符并键入 py
  • Android Studio Arctic Fox (Adb) - 连接的设备在一段时间后断开连接

    我有 7 部不同的 Android 手机 它们都有不同的 Android 操作系统 他们都面临着同样的断线问题 大约一小时后 设备将断开连接 当它断开连接时 Allow USB debugging 出现弹出窗口twice并希望我允许已批准的
  • 将 RIGHT 外连接转换为左外连接 SQLite

    我需要为 Sqlite 设计一个查询 原来的查询是这样的 FROM PhysicianActivity INNER JOIN Activity ON PhysicianActivity ActivityID Activity ID RIGH
  • 在运行时将 byte[] 加载到 System.Windows.Controls.Image 中

    我有一个代表 png 文件的 byte 我正在通过 WebClient 下载此 png 当 WebClient 下载了我通过 URL 引用的 png 时 我得到一个 byte 我的问题是 如何将 byte 加载到 WPF 中的 System
  • 调整大小后 QRubberBand 在 QGraphicsView 上移动

    我在这个主题中遇到了同样的问题 当我调整窗口大小时 QRubberBand 移动 经过几次尝试 我意识到本主题的解决方案不适用于 QGraphics 视图 当我调整窗口大小时 为什么我的选择会围绕 QgraphicsView 移动 impo