RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1291738
Accepted
Guamokolatokint
Guamokolatokint
Asked:2022-06-04 18:54:15 +0000 UTC2022-06-04 18:54:15 +0000 UTC 2022-06-04 18:54:15 +0000 UTC

缩放时,鼠标单击时图形的图像放置在错误的位置

  • 772

我举一个小应用程序的例子。它显示您要在其上绘制形状的图像。如果你不放大图像,那么一切都很好。但是当图像被放大时,图形被放置在错误的位置。

在此示例中,单击图像会放置一个点。如果您不更改缩放比例,那么一切正常。如果放大,则该点不会放置在鼠标光标所在的位置,而是更远。无法弄清楚如何解决这个问题。我还附上了一张 512x512 的图片。比例随鼠标滚轮而变化。

UI_test.py

from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import Qt
from random import randint

class Ui_Form(object):
    def setupUi(self, Form):
        Form.resize(1300, 700)
        self.layout = QtWidgets.QHBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.listWidget = QtWidgets.QListWidget()
        self.layout.addWidget(self.listWidget)
        self.stackedWidget = QtWidgets.QStackedWidget()
        self.layout.addWidget(self.stackedWidget)
        self.listWidget.currentRowChanged.connect(
            self.stackedWidget.setCurrentIndex)

        item1 = QtWidgets.QListWidgetItem(QtGui.QIcon('icons/settings.png'),'CamSettings', self.listWidget)
        item2 = QtWidgets.QListWidgetItem(QtGui.QIcon('icons/explore.png'),'Explore', self.listWidget)

        item1.setSizeHint(QtCore.QSize(10, 60))
        item2.setSizeHint(QtCore.QSize(10, 60))

        item1.setTextAlignment(QtCore.Qt.AlignCenter)
        item2.setTextAlignment(QtCore.Qt.AlignCenter)

        label1 = QtWidgets.QLabel('Это страница 1')
        label2= QtWidgets.QLabel('Это страница 2')
        label1.setAlignment(QtCore.Qt.AlignCenter)
        label2.setAlignment(QtCore.Qt.AlignCenter)
        label1.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
            randint(0, 255), randint(0, 255), randint(0, 255)))
        label2.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
            randint(0, 255), randint(0, 255), randint(0, 255)))

        self.img_rgb = QtWidgets.QGraphicsScene()
        self.view_rgb = QtWidgets.QGraphicsView()
        self.view_rgb.setScene(self.img_rgb )
        pixmap_rgb = QtGui.QPixmap()
        self.img_rgb.addPixmap('pic.png')
        border_style_rgb = f'border-style: solid; border-width: 2px;  background-color:#757575;'
        self.view_rgb.setStyleSheet(border_style_rgb)
        self.view_rgb.setFixedSize(520,520)
        self.view_rgb.mousePressEvent = Form.press_event
        #self.view_rgb.mouseMoveEvent = Form.move_event
        #self.view_rgb.mouseReleaseEvent = Form.release_event
        self.view_rgb.wheelEvent = Form.wheel_event

        first_panel_left = QtWidgets.QVBoxLayout()
        first_panel_left.setAlignment(Qt.AlignTop)
        first_panel_frame_left = QtWidgets.QFrame()
        first_panel_frame_left.setMinimumWidth(200)
        first_panel_frame_left.setLayout(first_panel_left)
        first_panel_right = QtWidgets.QVBoxLayout()
        first_panel_right.addWidget(self.view_rgb)
        first_panel_right.addStretch()
        first_panel_frame_right = QtWidgets.QFrame()
        first_panel_frame_right.setLayout(first_panel_right)
        main_first_box = QtWidgets.QHBoxLayout()
        main_first_box.addWidget(first_panel_frame_left)
        main_first_box.addWidget(first_panel_frame_right)
        first_container = QtWidgets.QWidget()
        first_container.setLayout(main_first_box)
        self.stackedWidget.addWidget(first_container)
        self.stackedWidget.addWidget(label2)
        Form.setLayout(self.layout)

应用程序.py

import sys
from PySide2 import QtWidgets
from UI_test import Ui_Form
from PySide2 import QtWidgets, QtGui, QtCore
from tools import DotPainter

class App(QtWidgets.QWidget):
    def __init__(self, parent = None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self._zoom = 0

    def press_event(self, event):
        self.clickPos = event.pos()
        self.clickBtn= event.button()
        print(self.clickPos)
        if self.clickBtn & QtCore.Qt.LeftButton:
            self.pointItem=DotPainter(self.ui.img_rgb,self.clickPos)

    def fitInView(self):
        rect = QtCore.QRectF(0.0, 0.0, 512.0, 512.0)
        if not rect.isNull():
            self.ui.view_rgb.setSceneRect(rect)
            unity = self.ui.view_rgb.transform().mapRect(QtCore.QRectF(0, 0, 1, 1))
            self.ui.view_rgb.scale(1 / unity.width(), 1 / unity.height())
            viewrect = self.ui.view_rgb.viewport().rect()
            scenerect = self.ui.view_rgb.transform().mapRect(rect)
            factor = min(viewrect.width() / scenerect.width(),
                        viewrect.height() / scenerect.height())
            self.ui.view_rgb.scale(factor, factor)
            self._zoom = 0

    def wheel_event(self,event):
        if event.angleDelta().y() > 0:
            factor = 1.25
            self._zoom += 1
        else:
            factor = 0.8
            self._zoom -= 1
        if self._zoom > 0:
            self.ui.view_rgb.scale(factor, factor)
        elif self._zoom == 0:
            self.fitInView()
        else:
            self._zoom = 0


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec_())

工具.py

from PySide2.QtCore import Qt,QRectF,QPointF,QSizeF
from PySide2.QtGui import QPen,QColor,QBrush,QPolygonF
from PySide2 import QtWidgets, QtGui, QtCore


class DotPainter(object):
    #класс для рисования точки
    def __init__(self, canvas, start):
        self.start = start
        self.canvas = canvas
        self.point=QRectF()
        self.width = self.point.width()
        self.height = self.point.height()
        self.PointF = QPointF(float(start.x()), float(start.y()))
        self.point.setTopLeft(self.PointF)
        self.point.setSize(QSizeF(8, 8))
        self.linePen = QPen(QtGui.QColor(255,0,0), 2)
        self.areaBrush = QBrush(QColor(255,0,0))
        self.pointItem=self.canvas.addRect(self.point,
                                              self.linePen,self.areaBrush)
    def mouseReleaseEvent(self, event):
        #функция события мыши для получения размеров точки
        self.width = self.point.width()
        self.height = self.point.height()

在此处输入图像描述

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Spatz
    2022-06-23T17:46:43Z2022-06-23T17:46:43Z

    您需要将点击位置转换为场景位置

        def press_event(self, event):
            self.clickPos = event.pos()
            self.clickBtn = event.button()
            scenePos = self.ui.view_rgb.mapToScene(self.clickPos)
            if self.clickBtn & QtCore.Qt.LeftButton:
                self.pointItem = DotPainter(self.ui.img_rgb, scenePos)
    

    或将点击处理程序绑定到场景本身(不是视图)并通过方法检索位置scenePos(此处理程序接收QGraphicsSceneMouseEvent类型的事件)

      self.img_rgb.mousePressEvent = Form.scene_press_event
    
        def scene_press_event(self, event):
            self.clickBtn = event.button()
            if self.clickBtn & QtCore.Qt.LeftButton:
                DotPainter(self.ui.img_rgb, event.scenePos())
    
    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5