Qt / PyQt4中基于对象的绘制/更新

时间:2012-10-23 05:59:29

标签: python qt pyqt pyqt4

我想通过使用PyQt4在Python中的图像上绘制多边形来标记项目。我能够使用QGraphicsScene实现图像查看器,但我不理解绘制/更新对象背后的概念。

我想做的是Polygon类,支持添加和编辑。令我困惑的是QGraphicsScene.addItem和不同的绘画或更新方法。我想要实现的是

  1. 将多边形绘制为线条而不完整
  2. 完成后将其绘制为填充多边形
  3. 算法部分没问题,我不明白的是如何实现绘画或更新功能。

    这是我的困惑

    在原始示例文件graphicsview/collidingmice中有一个特殊功能def paint(self, painter, option, widget):绘画是什么。没有函数调用paint函数,因此我认为它是QGraphicsView调用的一个特殊名称,但我不明白什么是画家以及绘制函数应该实现什么。

    另一方面,在众多在线教程中,我发现def paintEvent(self, event):函数,与graphicsview / paint相比,似乎遵循完全不同的概念。

    也许更好地解释一下:对于我来说 OpenGL的方式更新是清晰的,你总是清理所有内容并逐个重新绘制元素。在那里,您只需要处理您想要绘制的项目并绘制适当的项目。没有更新方法,因为您始终绘制最新状态。这种Qt GUI方式对我来说是新的。 您能否告诉我在将项目添加到场景后会发生什么??如何编辑某些内容已添加到场景中的内容,始终更新“循环”的位置

    这是我可能的最小形式的源,它创建第一个多边形并开始打印它的点。到目前为止,我已经到达了一次调用paint方法(为什么只调用一次?)并且出现了这个错误NotImplementedError: QGraphicsItem.boundingRect() is abstract and must be overridden。 (只需将任何jpg文件复制为big.jpg)

    from __future__ import division
    
    import sys
    from PyQt4 import QtCore, QtGui
    
    class Polygon( QtGui.QGraphicsItem ):
    
        def __init__(self):
            super(Polygon, self).__init__()
    
            self.points = []
            self.closed = False
    
        def addpoint( self, point ):
            self.points.append( point )
            print self.points
    
        def paint(self, painter, option, widget):
            print "paint"
    
    
    class MainWidget(QtGui.QWidget):
    
        poly_drawing = False
    
        def __init__(self):
            super(MainWidget, self).__init__()
    
            self.initUI()
    
        def initUI(self):
    
            self.scene = QtGui.QGraphicsScene()
    
            self.img = QtGui.QPixmap( 'big.jpg' )
    
                self.view = QtGui.QGraphicsView( self.scene )
            self.view.setRenderHint(QtGui.QPainter.Antialiasing)
            self.view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
                self.view.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
    
            self.pixmap_item = QtGui.QGraphicsPixmapItem( self.img, None, self.scene)
                self.pixmap_item.mousePressEvent = self.pixelSelect
    
                self.mypoly = Polygon()
    
                    layout = QtGui.QVBoxLayout()
                layout.addWidget( self.view )
                self.setLayout( layout )
            self.resize( 900, 600 )
            self.show()
    
        def resizeEvent(self, event):
            w_scale = ( self.view.width() )  / self.img.width()
            h_scale = ( self.view.height() ) / self.img.height()
            self.scale = min( w_scale, h_scale)
    
            self.view.resetMatrix()
            self.view.scale( self.scale, self.scale )
    
        def pixelSelect(self, event):
            if not self.poly_drawing:
                self.poly_drawing = True
                self.mypoly = Polygon()
                self.scene.addItem( self.mypoly )
    
            point = event.pos()
            self.mypoly.addpoint( point )
    
    
    def main():
    
        app = QtGui.QApplication(sys.argv)
        ex = MainWidget()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    

0 个答案:

没有答案