猿问

在 pyQt4 中的图像上涂鸦板

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

例如:假设图像是:

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

http://img.mukewang.com/611b95c60001527807740558.jpg

现在我想将它放入滚动条小部件(以便可以完全访问图像),最重要的是我想在其上进行任何类型的绘图(涂鸦)。我如何使用 PyQt4 做到这一点?有没有可用的python代码?


侃侃无极
浏览 216回答 1
1回答

慕沐林林

如果要放置图像,QScrollbar一个可能的选项是使用QScrollArea,但如果您表示要绘制正确的东西,则使用QGraphicsView它,因为它允许您添加项目。例如,制作您可以使用的涂鸦QGraphicsPathItem和图像QGraphicsPixmapItem,如下所示:from PyQt4 import QtCore, QtGuiclass 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_())
随时随地看视频慕课网APP

相关分类

Python
我要回答