python - QPaint 平移缩放与 mouseevent
问题描述
我需要用缩放和 绘制一个形状Qwheel event
。我试过painter.scale
and painter.translate
,但它根本不影响形状的缩放。
这个想法是绘制不同的形状,例如下图中的这个,一个具有起始值(200, 300)的矩形看起来很完美,甚至以 为中心canvas widget
。但是当具有更大的值( 500, 700 )时,如下图第二个所示会放大并变得不需要。我想用比例绘制它,并且能够用mouse event
.
可视化。
编码:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Foo(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Foo, self).__init__(parent)
self.setGeometry(QtCore.QRect(200, 100, 700, 600))
self.paint = Paint()
self.sizeHint()
self.lay = QtWidgets.QVBoxLayout()
self.lay.addWidget(self.paint)
self.setLayout(self.lay)
class Paint(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Paint, self).__init__(parent)
self.setBackgroundRole(QtGui.QPalette.Base)
self.setAutoFillBackground(True)
self._width = 200
self._height = 300
def paintEvent(self, event):
pen = QtGui.QPen()
brush = QtGui.QBrush( QtCore.Qt.darkCyan, QtCore.Qt.Dense5Pattern)
painter = QtGui.QPainter(self)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setPen(pen)
painter.setBrush(brush)
r = QtCore.QRect(QtCore.QPoint((self.width() - self._width)/ 2, (self.height() -self._height)/ 2), QtCore.QSize(self._width, self._height))
painter.drawRect(r)
painter.scale(0.4,0.4)
painter.translate(50, 50)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Foo()
w.show()
sys.exit(app.exec_())
我非常感谢任何帮助。谢谢
解决方案
The scale is given with respect to the top-left so if we want it to scale with respect to the center it must first be moved there, and after scaling it is placed in the initial position. For the case of the scale factor, use the wheelEvent
method using the angleDelta()
, multiplying by an appropriate factor.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Foo(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Foo, self).__init__(parent)
self.setGeometry(QtCore.QRect(200, 100, 700, 600))
self.paint = Paint()
self.sizeHint()
self.lay = QtWidgets.QVBoxLayout()
self.lay.addWidget(self.paint)
self.setLayout(self.lay)
class Paint(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Paint, self).__init__(parent)
self.setBackgroundRole(QtGui.QPalette.Base)
self.setAutoFillBackground(True)
self.r = QtCore.QRect(QtCore.QPoint(), QtCore.QSize(200, 300))
self._factor = 1.0
def paintEvent(self, event):
self.r.moveCenter(self.rect().center())
pen = QtGui.QPen()
brush = QtGui.QBrush( QtCore.Qt.darkCyan, QtCore.Qt.Dense5Pattern)
painter = QtGui.QPainter(self)
painter.setBrush(brush)
painter.setPen(pen)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.translate(self.rect().center())
painter.scale(self._factor, self._factor)
painter.translate(-self.rect().center())
painter.drawRect(self.r)
def wheelEvent(self, event):
self._factor *= 1.01**(event.angleDelta().y()/15.0)
self.update()
super(Paint, self).wheelEvent(event)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Foo()
w.show()
sys.exit(app.exec_())
推荐阅读
- javascript - Angular/PWA - 无法安装站点:页面无法离线工作
- javascript - 使用 js 在来自数据库的文本之前和之后添加 HTML 元素
- c++ - 分配内存 - 指针
- java - 在 JVM 中找不到命令,例如 adb
- python - Django添加字段以创建超级用户命令
- flutter - Flutter 本地通知每周重复通知
- node.js - 将 API 响应写入 .txt 文件
- python - Featuretools:使用 Pandas 'rolling' 生成滚动总和、平均值等,但以天为单位进行偏移
- python - 在 discord.py 中添加反应角色时出错
- javascript - React 原生动画进度条