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