Python 在pyQt4中的图像上涂鸦
假设我想加载一个图像并在上面涂鸦。但是如果图像较大,则无法放入图像查看器。因此我想要一个滚动条。我该怎么做 例如:假设图像是: 当我把它加载到我的程序中时,它变成:Python 在pyQt4中的图像上涂鸦,python,pyqt4,Python,Pyqt4,假设我想加载一个图像并在上面涂鸦。但是如果图像较大,则无法放入图像查看器。因此我想要一个滚动条。我该怎么做 例如:假设图像是: 当我把它加载到我的程序中时,它变成: 现在我想把它放到scrollbar小部件中(这样图像就可以完全访问),最重要的是我想在它上面画任何类型的画(涂鸦)。如何使用PyQt4实现这一点?有任何python代码可供使用吗?如果您想使用QScrollbar放置图像,一个可能的选项是使用qscrollara,但如果您表示要绘制,正确的方法是使用QGraphicsView,因
现在我想把它放到scrollbar小部件中(这样图像就可以完全访问),最重要的是我想在它上面画任何类型的画(涂鸦)。如何使用PyQt4实现这一点?有任何python代码可供使用吗?如果您想使用
QScrollbar
放置图像,一个可能的选项是使用qscrollara
,但如果您表示要绘制,正确的方法是使用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_())
@Anjan如果我的答案有助于您,请不要忘记将其标记为正确,如果您不知道如何做,请查看,这是表示感谢的最佳方式。还有一件事:假设在下一步中,我想在该图像的任意位置绘制点。所以我需要使用self.\u path.addPolygon(self.maptosene(x,y,1,1))函数。如何在此程序中使用QtGui.QPainter,以便使用drawPoint(x,y)功能?@Anjan为什么要使用QPainter?如果要绘制点,请使用QGraphicsSellipseitem,其中可以设置QBrush和QPen以设置绘画样式。QGraphicsItems是“绘制”的高级形式,QPainter是低级形式,在这种情况下是不必要的。