为了账号安全,请及时绑定邮箱和手机立即绑定

在 pyQt4 中的图像上涂鸦板

在 pyQt4 中的图像上涂鸦板

侃侃无极 2021-08-17 18:55:29
假设我想加载一个图像并在上面涂鸦。但是如果图像很大,那么它就无法放入图像查看器中。因此我想要一个滚动条。我该怎么做呢?例如:假设图像是:当我将它加载到我的程序中时,它变成:现在我想将它放入滚动条小部件(以便可以完全访问图像),最重要的是我想在其上进行任何类型的绘图(涂鸦)。我如何使用 PyQt4 做到这一点?有没有可用的python代码?
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

如果要放置图像,QScrollbar一个可能的选项是使用QScrollArea,但如果您表示要绘制正确的东西,则使用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_())

//img1.sycdn.imooc.com//611b95db00011a7d03990378.jpg

查看完整回答
反对 回复 2021-08-17
  • 1 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信