Python 如何从QMainWindow绘制QGraphicsView

Python 如何从QMainWindow绘制QGraphicsView,python,qt,pyqt,qgraphicsview,qmainwindow,Python,Qt,Pyqt,Qgraphicsview,Qmainwindow,下面显示的QgraphicsView和QMainWindow类的当前设计是我在另一个软件中的设计示例 我不得不在QGraphicsView中添加滚动条。 原始软件在QMainWindow中处理所有鼠标事件 问题:通过QMainWindow绘制QGraphicsView的方法是什么 import sys from PyQt4 import QtGui from PyQt4 import QtCore class Window(QtGui.QGraphicsView): def __ini

下面显示的QgraphicsView和QMainWindow类的当前设计是我在另一个软件中的设计示例

我不得不在QGraphicsView中添加滚动条。 原始软件在QMainWindow中处理所有鼠标事件

问题:通过QMainWindow绘制QGraphicsView的方法是什么

import sys

from PyQt4 import QtGui
from PyQt4 import QtCore

class Window(QtGui.QGraphicsView):

  def __init__(self, parent=None):

        QtGui.QGraphicsView.__init__(self, parent)
        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setBackgroundBrush(QtGui.QBrush(QtCore.Qt.darkGray, QtCore.Qt.SolidPattern))
        self.setScene(self.scene)

        #self.setDragMode(QtGui.QGraphicsView.ScrollHandDrag)
        self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
        #self.viewport().setCursor(QtCore.Qt.CrossCursor)
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

        print "sdsads"


  def mousePressEvent(self, ev):
        item = QtGui.QGraphicsTextItem("")
        item.setPos(ev.x(), ev.y())
        self.scene.addItem(item)

        print "ev.x() ", ev.x()


class CityscapesLabelTool(QtGui.QMainWindow):
    def __init__(self, parent=None):

        QtGui.QMainWindow.__init__(self, parent)
        centralwidget = Window()
        self.setCentralWidget(centralwidget) 

        centralwidget.scene.addPixmap(QtGui.QPixmap("exit.png"))



app = QtGui.QApplication(sys.argv)
GUI = CityscapesLabelTool()
GUI.show()
sys.exit(app.exec_())

QGraphicsView
中,向场景添加项目是正常的,例如,如果要绘制多边形,则必须使用
QGraphicsPolygonItem
,如果要获得正确的点,则必须使用
qgraphicscene
而不是
QGraphicsView

在以下示例中,可以通过单击鼠标左键指示多边形点,然后单击鼠标右键完成图形

import sys

from PyQt4 import QtCore, QtGui

class GraphicsScene(QtGui.QGraphicsScene):
    def __init__(self, *args, **kwargs):
        QtGui.QGraphicsScene.__init__(self, *args, **kwargs)
        self.polygon = None

    def mousePressEvent(self, ev):
        if ev.button() == QtCore.Qt.RightButton:
            self.polygon << ev.scenePos()
            item = QtGui.QGraphicsPolygonItem(self.polygon)
            item.setPen(QtGui.QPen(QtCore.Qt.red))
            item.setBrush(QtGui.QBrush(QtCore.Qt.red))
            self.addItem(item)
            # or
            # self.addPolygon(self.polygon, QtGui.QPen(QtCore.Qt.red), QtGui.QBrush(QtCore.Qt.red))
            self.polygon = None

        else:
            if self.polygon is None:
                self.polygon = QtGui.QPolygonF()
            self.polygon << ev.scenePos()

class Window(QtGui.QGraphicsView):
    def __init__(self, parent=None):
        QtGui.QGraphicsView.__init__(self, parent)
        self.scene =GraphicsScene(QtCore.QRectF(0, 0, 640, 480), self)
        self.scene.setBackgroundBrush(QtGui.QBrush(QtCore.Qt.darkGray, QtCore.Qt.SolidPattern))
        self.setScene(self.scene)
        #self.setDragMode(QtGui.QGraphicsView.ScrollHandDrag)
        self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
        #self.viewport().setCursor(QtCore.Qt.CrossCursor)
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)


class CityscapesLabelTool(QtGui.QMainWindow):
    def __init__(self, parent=None):

        QtGui.QMainWindow.__init__(self, parent)
        centralwidget = Window()
        self.setCentralWidget(centralwidget) 

        centralwidget.scene.addPixmap(QtGui.QPixmap("exit.png"))


app = QtGui.QApplication(sys.argv)
GUI = CityscapesLabelTool()
GUI.show()
sys.exit(app.exec_())

什么是画图,你想在拖动鼠标的同时画线吗?对不起,我指的是在屏幕上画点,在屏幕上画多边形。所有这些都应该通过点击屏幕来完成@eyllanesc我的意思是,我理解每次你按下一个点,该点将是多边形的一部分,因为它表明多边形应该已经完成了?@eyllanesc对不起,但我真的不理解这句话的意思
因为指示多边形应该已经完成
。实际上,绘图部分已经在QMainWindow类中完成了。我只需要在GraphicsView类上单击鼠标,这样QMainWindow就可以绘制它所绘制的任何东西-这次是在GraphicsView上。它不是在QGraphicsView中绘制的,只是为了添加项,我的问题是,您如何表示要绘制三角形、四边形,即,多谢你的努力。但基本上是说我不能在CityscapesLabelTool类中编写点绘图或任何绘图代码吗?是的,一个查询:您是否只想在QScrollBar中使用QGraphicsView?实际上我想添加一个滚动条并在滚动条内显示图片。如果有任何方法可以达到同样的效果,这将允许我让绘图代码出现在QMainWindow中,那么请告诉我。QGraphicsClass已经存在。我添加了滚动条,因为这是我认为可以添加滚动条的唯一方式。@Aquarius_Girl我想我还有另一种选择,但在尝试之前,我需要准确理解你所说的绘画,你可以给我一个你如何绘画的例子,您想使用QPainter吗?这里的绘图确切地说意味着允许用户在屏幕上绘制任意多的点。当他画两个点时,会自动在它们之间画一条线。然后,当他添加点时,线会自动在它们之间绘制,形成多边形的形状。后来,当他找到第一个点时,多边形就完成了。所以,“我”不应该做任何事。所有这些工作都已在该软件中完成。我只是想添加滚动条部分。
import sys

from PyQt4 import QtCore, QtGui


class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.polygon = None
        self.setFixedSize(640, 480)
        self.pixmap = None

    def mousePressEvent(self, ev):
        if self.polygon is None:
            self.polygon = QtGui.QPolygon()
        self.polygon << ev.pos()
        self.update()

    def paintEvent(self, ev):
        painter = QtGui.QPainter(self)
        painter.fillRect(self.rect(), QtGui.QBrush(QtCore.Qt.darkGray, QtCore.Qt.SolidPattern))
        painter.drawPixmap(QtCore.QPoint(0, 0), QtGui.QPixmap("exit.png"))
        if self.polygon is not None:
            painter.setPen(QtCore.Qt.blue)
            painter.drawPolyline(self.polygon)



class CityscapesLabelTool(QtGui.QMainWindow):
    def __init__(self, parent=None):

        QtGui.QMainWindow.__init__(self, parent)
        scroll = QtGui.QScrollArea()

        scroll.setBackgroundRole(QtGui.QPalette.Dark)
        scroll.setWidget(Window())
        scroll.setWidgetResizable(True)
        self.setCentralWidget(scroll)



app = QtGui.QApplication(sys.argv)
GUI = CityscapesLabelTool()
GUI.show()
sys.exit(app.exec_())