慕沐林林
如果要放置图像,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_())