Python 在pyQt4中的图像上涂鸦

Python 在pyQt4中的图像上涂鸦,python,pyqt4,Python,Pyqt4,假设我想加载一个图像并在上面涂鸦。但是如果图像较大,则无法放入图像查看器。因此我想要一个滚动条。我该怎么做 例如:假设图像是: 当我把它加载到我的程序中时,它变成: 现在我想把它放到scrollbar小部件中(这样图像就可以完全访问),最重要的是我想在它上面画任何类型的画(涂鸦)。如何使用PyQt4实现这一点?有任何python代码可供使用吗?如果您想使用QScrollbar放置图像,一个可能的选项是使用qscrollara,但如果您表示要绘制,正确的方法是使用QGraphicsView,因

假设我想加载一个图像并在上面涂鸦。但是如果图像较大,则无法放入图像查看器。因此我想要一个滚动条。我该怎么做

例如:假设图像是:

当我把它加载到我的程序中时,它变成:


现在我想把它放到scrollbar小部件中(这样图像就可以完全访问),最重要的是我想在它上面画任何类型的画(涂鸦)。如何使用PyQt4实现这一点?有任何python代码可供使用吗?

如果您想使用
QScrollbar
放置图像,一个可能的选项是使用
qscrollara
,但如果您表示要绘制,正确的方法是使用
QGraphicsView
,因为它允许您添加项目。例如,要制作涂鸦,您可以使用
QGraphicsPathItem
和图像
QGraphicsPixmapItem
,如下所示:

from PyQt4 import QtCore, QtGui

class ScribbleView(QtGui.QGraphicsView):
    def __init__(self, parent=None):
        super(ScribbleView, self).__init__(parent)
        self.setScene(QtGui.QGraphicsScene(self))
        self._image_item = QtGui.QGraphicsPixmapItem()
        self.scene().addItem(self._image_item)
        self.initial_path()

    def initial_path(self):
        self._path = QtGui.QPainterPath()
        pen = QtGui.QPen(QtGui.QColor("green"), 4, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap)
        self._path_item = self.scene().addPath(self._path, pen)

    @QtCore.pyqtSlot()
    def load_image(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 
            "Open Image", QtCore.QDir.currentPath(), 
            "Image Files (*.png *.jpg *.bmp)")
        if filename:
            self._image_item.setPixmap(QtGui.QPixmap(filename))

    def mousePressEvent(self, event):
        if not self._image_item.pixmap().isNull():
            self._path.moveTo(self.mapToScene(event.pos()))
            self._path_item.setPath(self._path)
        super(ScribbleView, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if not self._image_item.pixmap().isNull():
            self._path.lineTo(self.mapToScene(event.pos()))
            self._path_item.setPath(self._path)
        super(ScribbleView, self).mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        if not self._image_item.pixmap().isNull():
            self._path.lineTo(self.mapToScene(event.pos()))
            self._path_item.setPath(self._path)       
            self.initial_path()
        super(ScribbleView, self).mouseReleaseEvent(event)

class ScribbleWidget(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ScribbleWidget, self).__init__(parent)
        view = ScribbleView()
        self.setCentralWidget(view)
        menubar = self.menuBar()
        file_menu = menubar.addMenu("&File")
        image_action = file_menu.addAction("Load Image")
        image_action.triggered.connect(view.load_image)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = ScribbleWidget()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

@Anjan如果我的答案有助于您,请不要忘记将其标记为正确,如果您不知道如何做,请查看,这是表示感谢的最佳方式。还有一件事:假设在下一步中,我想在该图像的任意位置绘制点。所以我需要使用self.\u path.addPolygon(self.maptosene(x,y,1,1))函数。如何在此程序中使用QtGui.QPainter,以便使用drawPoint(x,y)功能?@Anjan为什么要使用QPainter?如果要绘制点,请使用QGraphicsSellipseitem,其中可以设置QBrush和QPen以设置绘画样式。QGraphicsItems是“绘制”的高级形式,QPainter是低级形式,在这种情况下是不必要的。