【问题标题】:How to draw on QGraphicsView from QMainWindow如何从 QMainWindow 在 QGraphicsView 上绘图
【发布时间】:2018-09-16 03:13:54
【问题描述】:

下面显示的 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_())

【问题讨论】:

  • draw是什么意思,要不要一边拖动鼠标一边画线?
  • 对不起,我的意思是在屏幕上画一个点,在屏幕上画多边形。所有这些都应该通过点击屏幕来完成。 @eyllanesc
  • 我的意思是,我明白每次你按下一个点,那个点都会成为多边形的一部分,因为它表明多边形应该已经完成​​了?
  • @eyllanesc 很抱歉,但我真的不明白这句话的意思。 as it is indicated that the polygon should be finished already。实际上绘制的部分已经在 QMainWindow 类中完成了。我只需要将鼠标单击放在 GraphicsView 类上,这样 QMainWindow 就能够绘制它正在绘制的任何内容 - 这次是在 graphicsview 上。
  • 它不是在QGraphicsView中绘制的,只是为了添加项目,我的问题是你如何表示你要绘制一个三角形,一个四边形,即边数。

标签: python qt pyqt qgraphicsview qmainwindow


【解决方案1】:

QGraphicsView 中,向场景中添加项目是正常的,例如,如果您想绘制多边形,则必须使用QGraphicsPolygonItem,如果您想获得正确的点,则必须使用QGraphicsScene 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_())

输出:


您有一个XY problem,您正在寻找解决主要问题的解决方案,但不知道它是正确的,根据您的评论,您的主要问题是将QScrollBar 添加到@ 987654332@,并且在该元素中您要绘制图纸,因此不必使用QGraphicsView,而是使用QScrollArea

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

【讨论】:

  • 感谢您的努力。但基本上意味着我不能在 CityscapesLabelTool 类中编写点绘图或任何绘图代码吗?
  • 是的,一个查询:你只想为 QScrollBar 使用 QGraphicsView 吗?
  • 其实我想加一个滚动条,把图片显示在滚动条里面。如果有什么方法可以让我让绘图代码在 QMainWindow 中,那么请告诉我。 QGraphicsClass 已经存在。我向它添加了滚动条,因为这是我认为可以添加滚动条的唯一方法。
  • @Aquarius_Girl 我想我还有另一种选择,但在尝试之前我需要了解你所说的绘画到底是什么,你可以给我看一个你如何绘画的例子,你想使用QPainter吗?
  • 这里画图就是允许用户在屏幕上画任意多的点。当他画两个点时,它们之间会自动画一条线。然后,当他添加点时,会在它们之间自动绘制线,形成多边形。稍后当他单击第一个点时,多边形变得完整。所以,“我”不应该做任何事。所有这些工作都已在该软件中完成。我只是应该添加滚动条部分。
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
相关资源
最近更新 更多