我想用鼠标绘制图像。 我通过这段代码简化了问题。 当我取消注释第31行时,代码不起作用。 我的目标是绘制要从PC中选择的图像,并在修改后保存该图像。
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(QtWidgets.QMainWindow):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(581, 463)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.selectImgeBtn = QtWidgets.QPushButton(self.centralwidget)
self.selectImgeBtn.setGeometry(QtCore.QRect(50, 80, 121, 61))
font = QtGui.QFont()
font.setFamily("Roboto")
font.setPointSize(11)
self.selectImgeBtn.setFont(font)
self.selectImgeBtn.setObjectName("selectImgeBtn")
self.drawing = False
self.brushSize = 2
self.brushColor = QtCore.Qt.black
self.lastPoint = QtCore.QPoint()
self.imageLb = QtWidgets.QLabel(self.centralwidget)
self.imageLb.setGeometry(QtCore.QRect(210, 10, 331, 201))
self.imageLb.setFrameShape(QtWidgets.QFrame.Box)
self.imageLb.setText("")
self.imageLb.setObjectName("imageLb")
self.imageLb.mousePressEvent = self.mousePressEvent
self.imageLb.mouseMoveEvent = self.mouseMoveEvent
self.imageLb.mouseReleaseEvent = self.mouseReleaseEvent
# self.imageLb.paintEvent = self.paintEvent # When i uncomment this line the program is broken
self.selectImgeBtn.clicked.connect(self.setImage)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.selectImgeBtn.setText(_translate("MainWindow", "Select Image"))
def setImage(self):
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(None, "Select Image", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")
if fileName:
pixmap = QtGui.QPixmap(fileName)
pixmap = pixmap.scaled(self.imageLb.width(), self.imageLb.height(), QtCore.Qt.KeepAspectRatio)
self.imageLb.setPixmap(pixmap)
self.imageLb.setAlignment(QtCore.Qt.AlignCenter)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.drawing = True
self.lastPoint = event.pos()
print(self.lastPoint)
def mouseMoveEvent(self, event):
if (event.buttons() == QtCore.Qt.LeftButton) and self.drawing:
painter = QtGui.QPainter(self.imageLb)
painter.setPen(QtGui.QPen(self.brushColor, self.brushSize, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
painter.drawLine(self.lastPoint, event.pos())
self.lastPoint = event.pos()
self.imageLb.update()
def mouseReleaseEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.drawing = False
def paintEvent(self, event):
canvasPainter = QtGui.QPainter(self)
canvasPainter.drawImage(self.rect(), self.imageLb, self.imageLb.rect())
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
答案 0 :(得分:0)
不要不在paintEvent()
之外的小部件内绘制。 Qt不支持。
您可以改为绘制QImage
或QPixmap
,然后在小部件的paintEvent()
中绘制该图像。如果您想合成多张图像(背景+绘图)而不是直接在背景上绘图,则图像也可以使用所有透明像素初始化。
答案 1 :(得分:0)
我认为最适合您的方法是使用QLabel查看图像,并使用OpenCV通过这些事件绘制图像。问题是您每次更改后都需要刷新图像。我在这个项目project中做到了这一点,它正在运行,但是如果您使用QT库,则可能会更好。