Блокнот над изображением в pyQt4 - PullRequest
0 голосов
/ 14 ноября 2018

предположим, я хочу загрузить изображение и набросать его. Но если изображение большое, оно не может поместиться в средство просмотра изображений. Следовательно, я хочу полосу прокрутки. Как мне это сделать?

Например: допустим, изображение:

enter image description here

и когда я загружаю его в свою программу, он становится:

enter image description here

Теперь я хочу поместить его в виджет полосы прокрутки (чтобы к нему можно было полностью получить доступ к изображению), и самое главное, я хочу сделать на нем любой рисунок (каракули). Как мне сделать это с помощью PyQt4? Есть ли какой-нибудь код на Python для этого?

1 Ответ

0 голосов
/ 15 ноября 2018

Если вы хотите разместить изображение с 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_())

enter image description here

...