Шкала перевода QPaint с помощью mouseevent - PullRequest
0 голосов
/ 29 октября 2018

Мне нужно нарисовать фигуру с масштабированием и Qwheel event. Я пробовал painter.scale и painter.translate, но это никак не влияет на масштабирование фигуры.

Идея состоит в том, чтобы рисовать различные фигуры, например, эту на на рисунке ниже , прямоугольную форму с начальным значением (200, 300) выглядит идеально и даже с центром в canvas widget. но когда с большим значением (500, 700) , как показано на секунду ниже, цифра увеличивается и становится нежелательной. Я хочу нарисовать его с масштабом и со способностью к колесу (увеличение и уменьшение) это с mouse event.

Визуализация.

enter image description here

enter image description here

Код:

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

Я ценю любую помощь. Спасибо

1 Ответ

0 голосов
/ 29 октября 2018

Масштаб задается относительно верхнего левого угла, поэтому, если мы хотим, чтобы он масштабировался относительно центра, его сначала нужно переместить туда, а после масштабирования поместить в исходное положение. Для случая масштабного коэффициента используйте метод 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_())

enter image description here

enter image description here

enter image description here

...