【问题标题】:QPaint translation scale with mouseeventQPaint 平移缩放与 mouseevent
【发布时间】:2019-04-02 13:44:46
【问题描述】:

我需要用缩放和Qwheel event 绘制一个形状。我试过painter.scalepainter.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_())

我非常感谢任何帮助。谢谢

【问题讨论】:

  • 鼠标事件还是滚轮事件?
  • 哪个更灵活?使用轮子事件

标签: python python-3.x pyqt pyqt5 qpainter


【解决方案1】:

比例是相对于左上角给出的,所以如果我们希望它相对于中心进行缩放,必须首先将其移动到那里,然后在缩放后将其放置在初始位置。对于比例因子的情况,使用wheelEvent 方法,使用angleDelta(),乘以适当的因子。

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_())

【讨论】:

  • 非常感谢,正是我想要的。但是出现了两个问题,是否有更好的方法可以在前后轮的情况下获得更平滑的像素变化?我们是否通过使用MouseEvent 获得相同的行为?
  • @ZarKha 为什么要使用鼠标事件?如何用鼠标指示有放大或缩小?
  • 我只是好奇。例如左键是缩小,右键是放大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2013-12-12
  • 2016-03-10
  • 2014-09-30
  • 2022-01-22
相关资源
最近更新 更多