【问题标题】:How to scale a QGraphicsItem without changing its position如何在不改变其位置的情况下缩放 QGraphicsItem
【发布时间】:2014-07-11 13:26:46
【问题描述】:

我有一个 QGraphicsRect 可以动态改变它的高度。我想在它的高度改变后将它的高度标准化为 1。如果我尝试应用QTransformscale() 函数,如果QGraphicsRecty 位置不为0,它的y 位置也会发生变化。

在应用缩放之前,我尝试将QGraphicsRect 移回场景的原点,但没有帮助。有什么想法吗?

下面的最小工作示例。 (按下按钮更改QRectItem 的高度)。如果问题解决了,QGraphicsRect 上下边缘应始终位于红线上。

import sys
import numpy as np
from PySide import QtCore, QtGui

class Test(QtGui.QMainWindow):
    def __init__(self):
        super(Test, self).__init__()


        self.setupUi(self)
        self.setupGV()
        self.connectElements()

        self.rectY = 3
        self.initRect()

        self.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gv_center = QtGui.QGraphicsView(self.centralwidget)
        self.gv_center.setGeometry(QtCore.QRect(100, 60, 561, 331))
        self.gv_center.setObjectName("gv_center")
        self.pb_debug = QtGui.QPushButton(self.centralwidget)
        self.pb_debug.setGeometry(QtCore.QRect(540, 500, 94, 24))
        self.pb_debug.setObjectName("pb_debug")
        self.pb_debug.setText("push !")
        MainWindow.setCentralWidget(self.centralwidget)


    def connectElements(self):
        self.pb_debug.clicked.connect(self.buttonClick)

    def setupGV(self):
        self.overviewScene = QtGui.QGraphicsScene(self)
        self.overviewScene.setSceneRect(0, -0.5, 1, 7)

        self.gv_center.setScene(self.overviewScene)
        self.gv_center.fitInView(0, -0.5, 1, 7)

    def initRect(self):
        self.overviewScene.addLine(-5, self.rectY, 5, self.rectY, QtGui.QPen(QtGui.QColor(255, 0, 0)))
        self.overviewScene.addLine(-5, self.rectY + 1, 5, self.rectY + 1, QtGui.QPen(QtGui.QColor(255, 0, 0)))
        self.rect = self.overviewScene.addRect(0, self.rectY, 1, 1, QtGui.QPen(QtGui.QColor(0, 0, 0)))

    def buttonClick(self):
        newHeight = np.random.randint(1, 10)
        print(newHeight)
        geo = self.rect.rect()
        geo.setHeight(newHeight)
        self.rect.setRect(geo)

        self.normalizeSubplot(self.rect, newHeight, self.rectY)

    def normalizeSubplot(self, subplotItem, accH, y):
        subplotItem.prepareGeometryChange()
        if accH != 0:
            height = 1.0 / accH
        else:
            height = 0

        trans = subplotItem.transform()
        trans.setMatrix(1,           trans.m12(), trans.m13(),
                        trans.m21(), height,      trans.m23(),
                        trans.m31(), trans.m32(), 1)

        subplotItem.setTransform(trans)




if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)

    w = Test()

    sys.exit(app.exec_())

【问题讨论】:

    标签: qt pyside transformation qgraphicsitem


    【解决方案1】:

    几天后,我在 IRC 的某个人的帮助下找到了解决方案。变换矩阵必须是:

    trans.setMatrix(1,           trans.m12(), trans.m13(),
                    trans.m21(), height,      trans.m23(),
                    trans.m31(), -height * self.rectY + self.rectY, 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多