Qt рисование линий в неожиданном месте - PullRequest
2 голосов
/ 19 ноября 2011

Я пытаюсь написать программу для рисования, но у меня проблемы с рисованием линий.Когда я рисую линию в нижней части QGraphicsView, линия рисуется в центре виджета.Зачем?Я не думаю, что понимаю функции mapTo достаточно хорошо, но чем больше я читаю документы Qt, тем больше путаюсь.Надеюсь, что кто-то может помочь.

from PyQt4.QtGui  import *
from PyQt4.QtCore import *

import sys

class Main(QWidget):

    def __init__(self, parent):
        super(Main, self).__init__(parent)

        self.resize(300, 300)
        vBox = QVBoxLayout(self)
        view = View(self)
        vBox.addWidget(view)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Escape:
            sys.exit()

class View(QGraphicsView):

    def __init__(self, parent):
        super(View, self).__init__(parent)
        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)

    def mousePressEvent(self, event):
        self.start = event.pos()

    def mouseReleaseEvent(self, event):
        self.stop = event.pos()
        self.line = Line(self, self.start, self.stop)
        self.scene.addItem(self.line)

class Line(QGraphicsLineItem):

    def __init__(self, parent, *args):
        # args = start, stop
        points = map(parent.mapToScene, args)
        (start, stop) = map(QPointF, points)

        self.line = QLineF(start, stop)
        super(Line, self).__init__(self.line)        

def run():
    app = QApplication(sys.argv)
    a   = Main(None)
    a.show()
    sys.exit(app.exec_())

run()

1 Ответ

2 голосов
/ 19 ноября 2011

Если вы не зададите прямоугольник для вашей сцены, он будет рассчитан автоматически, и представление сосредоточится на объектах внутри него.

Чтобы это исправить, добавьте следующее в конец View.__init__():

self.setSceneRect(QRectF(self.viewport().rect()))
...