一个月前,我在问,如何翻译场景,我得到了很大的帮助,了解了如何使其工作,在与它合作/添加工作人员一个月后,我注意到,当你放大到非常接近几何体或其他地方时,翻译变得越来越有价值
必须放大非常接近几何体的区域才能看到问题。下面是一些代码:
from PyQt5.QtGui import QColor, QPolygonF, QPen, QBrush
from PyQt5.QtCore import Qt, QPointF, QPoint, pyqtSignal
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGraphicsView, QGraphicsScene, QGraphicsPolygonItem, QApplication, \
QFrame, QSizePolicy
points_list = [[60.1, 19.6, 0.0], [60.1, 6.5, 0.0], [60.1, -6.5, 0.0], [60.1, -19.6, 0.0], [60.1, -19.6, 0.0],
[20.0, -19.6, 0.0], [-20, -19.6, 0.0], [-60.1, -19.6, 0.0], [-60.1, -19.6, 0.0], [-60.1, -6.5, 0.0],
[-60.1, 6.5, 0.0], [-60.1, 19.6, 0.0], [-60.1, 19.6, 0.0], [-20.0, 19.6, 0.0], [20.0, 19.6, 0.0],
[60.1, 19.6, 0.0]]
class MainWindow(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent=parent)
self.create()
def create(self, **kwargs):
main_layout = QVBoxLayout()
graphics = MainGraphicsWidget()
main_layout.addWidget(graphics)
self.setLayout(main_layout)
class MainGraphicsWidget(QGraphicsView):
zoom_signal = pyqtSignal(bool)
def __init__(self, parent=None):
super(MainGraphicsWidget, self).__init__(parent)
self._scene = QGraphicsScene(backgroundBrush=Qt.gray)
self.__zoom = 0
self.setScene(self._scene)
self.setTransformationAnchor(QGraphicsView.NoAnchor)
#self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setBackgroundBrush(QBrush(QColor(30, 30, 30)))
self.setFrameShape(QFrame.NoFrame)
self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
# self.sceneRect = self._scene.sceneRect()
self.testButton = GraphicsButton()
self._scene.addItem(self.testButton)
self.startPos = None
def mousePressEvent(self, event):
if event.modifiers() & Qt.AltModifier and event.button() == Qt.LeftButton:
self.startPos = event.pos()
else:
super(MainGraphicsWidget, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
modifierPressed = QApplication.keyboardModifiers()
if self.startPos is not None:
delta = self.startPos - event.pos()
transform = self.transform()
deltaX = delta.x() / transform.m11()
deltaY = delta.y() / transform.m22()
self.setSceneRect(self.sceneRect().translated(deltaX, deltaY))
self.startPos = event.pos()
else:
super(MainGraphicsWidget, self).mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
self.startPos = None
super(MainGraphicsWidget, self).mouseReleaseEvent(event)
def wheelEvent(self, event):
if event.angleDelta().y() > 0:
factor = 1.25
self.__zoom += 1
else:
factor = 0.8
self.__zoom -= 1
self.scale(factor, factor)
self.zoom_signal.emit(self.__zoom < 10)
class GraphicsButton(QGraphicsPolygonItem):
def __init__(self, parent=None):
super(GraphicsButton, self).__init__(parent)
self.myPolygon = QPolygonF([QPointF(v1, v2) for v1, v2, v3 in points_list])
self.setPen(QPen(QColor(0, 0, 0), 0, Qt.SolidLine, Qt.FlatCap, Qt.MiterJoin))
self.setPolygon(self.myPolygon)
self.setBrush(QColor(220, 40, 30))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.setGeometry(500, 100, 500, 900)
window.show()
sys.exit(app.exec_())
(翻译开始使用Alt+左键单击)
我想问题是当你们放大太近的时候,你们的光标仍然沿着相同的坐标移动(它们并没有变小),它开始变慢,我的代码中并没有考虑这一点。但是为什么有时候我的sceneRect().translated()
会停止移动呢?我是否放大到了一个点,而我的光标(1x,1y)至少没有交叉
所以我的问题是,如果我的理论正确,有人能建议我如何计算delta
,放大和缩小吗?谢谢你,对不起我的英语
编辑:这是一个屏幕截图,显示您需要放大多少才能看到问题
以上答案部分正确。在我看来,您的方法是尝试通过分解视口比例来转换场景。“m11和m22”。但是,放大时,视口比例将小于1。 translate函数不接受低于1的值。尝试打印出DeltaX放大时,您将看到只有在DeltaX>;1.
您可以采取的两种方法是:
A)当增量轴'大于0时,手动将其四舍五入到1.1左右,即大于1
B)像上面提到的eyllanesc一样,将视口投影到场景中,这样所做的任何转换都将在相对于视口空间的场景空间中进行。此外,为了使缩放定位保持一致,还可以在缩放场景时将鼠标位置转换为场景空间。最后,eyllanesc添加了一行冗余的代码,可以正确地进行翻译。按下鼠标按钮时,无需重置鼠标的原点位置
因此,你可以得到这样的结果
^{} 位于场景的坐标中,而不是视图的坐标中,因此在进行计算时,必须使用mapToScene方法将鼠标点转换为场景的坐标。此修改还应应用于场景中投影的视口矩形,因为该矩形不等于场景
相关问题 更多 >
编程相关推荐