Python 3.x 在QWidget python GUI上绘制圆
我想画一个圆而不是点 下面是一个类,在该类中,它在小部件中的任何位置的按下事件上绘制红点 我想画一个圆(空心圆)作为轮廓,而不是隐藏部分图片的实心圆Python 3.x 在QWidget python GUI上绘制圆,python-3.x,user-interface,pyqt5,touch-event,qpainter,Python 3.x,User Interface,Pyqt5,Touch Event,Qpainter,我想画一个圆而不是点 下面是一个类,在该类中,它在小部件中的任何位置的按下事件上绘制红点 我想画一个圆(空心圆)作为轮廓,而不是隐藏部分图片的实心圆 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class Canvas(QWidget): def __init__(self,
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Canvas(QWidget):
def __init__(self, photo, *args, **kwargs):
super().__init__(*
args, **kwargs)
self.image = QImage(photo)
self.setFixedSize(self.image.width(), self.image.height())
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
qp = QPainter(self.image)
qp.setRenderHint(QPainter.Antialiasing)
qp.setPen(QPen(Qt.red, 5))
qp.setBrush(Qt.red)
qp.drawPoint(event.pos())
self.update()
def paintEvent(self, event):
qp = QPainter(self)
rect = event.rect()
qp.drawImage(rect, self.image, rect)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
w = QWidget()
self.setCentralWidget(w)
grid = QGridLayout(w)
grid.addWidget(Canvas('photo.jpeg'))
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = MainWindow()
gui.show()
sys.exit(app.exec_())
我相信这就是你想要做的 在这种情况下,您需要利用要传递给QPainter的喷漆设备。在
mousePressEvent
和mouseMoveEvent
期间,请使用QPainter(self)
,以便绘制的任何内容只会持续到下一次更新。然后在mouseReleaseEvent
中,当您对圆的大小感到满意时,可以使用QPaint(self.image)
在QImage上绘制圆,以永久绘制圆
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Canvas(QWidget):
def __init__(self, photo, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image = QImage(photo)
self.setFixedSize(self.image.width(), self.image.height())
self.pressed = self.moving = False
self.revisions = []
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.pressed = True
self.center = event.pos()
self.update()
def mouseMoveEvent(self, event):
if event.buttons() & Qt.LeftButton:
self.moving = True
r = (event.pos().x() - self.center.x()) ** 2 + (event.pos().y() - self.center.y()) ** 2
self.radius = r ** 0.5
self.update()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.revisions.append(self.image.copy())
qp = QPainter(self.image)
self.draw_circle(qp) if self.moving else self.draw_point(qp)
self.pressed = self.moving = False
self.update()
def paintEvent(self, event):
qp = QPainter(self)
rect = event.rect()
qp.drawImage(rect, self.image, rect)
if self.moving:
self.draw_circle(qp)
elif self.pressed:
self.draw_point(qp)
def draw_point(self, qp):
qp.setPen(QPen(Qt.black, 5))
qp.drawPoint(self.center)
def draw_circle(self, qp):
qp.setRenderHint(QPainter.Antialiasing)
qp.setPen(QPen(Qt.black, 3, Qt.DashLine))
qp.drawEllipse(self.center, self.radius, self.radius)
def undo(self):
if self.revisions:
self.image = self.revisions.pop()
self.update()
def reset(self):
if self.revisions:
self.image = self.revisions[0]
self.revisions.clear()
self.update()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
w = QWidget()
self.setCentralWidget(w)
canvas = Canvas('photo.png')
grid = QGridLayout(w)
grid.addWidget(canvas)
QShortcut(QKeySequence('Ctrl+Z'), self, canvas.undo)
QShortcut(QKeySequence('Ctrl+R'), self, canvas.reset)
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = MainWindow()
gui.show()
sys.exit(app.exec_())
我相信这就是你想要做的 在这种情况下,您需要利用要传递给QPainter的喷漆设备。在
mousePressEvent
和mouseMoveEvent
期间,请使用QPainter(self)
,以便绘制的任何内容只会持续到下一次更新。然后在mouseReleaseEvent
中,当您对圆的大小感到满意时,可以使用QPaint(self.image)
在QImage上绘制圆,以永久绘制圆
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Canvas(QWidget):
def __init__(self, photo, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image = QImage(photo)
self.setFixedSize(self.image.width(), self.image.height())
self.pressed = self.moving = False
self.revisions = []
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.pressed = True
self.center = event.pos()
self.update()
def mouseMoveEvent(self, event):
if event.buttons() & Qt.LeftButton:
self.moving = True
r = (event.pos().x() - self.center.x()) ** 2 + (event.pos().y() - self.center.y()) ** 2
self.radius = r ** 0.5
self.update()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.revisions.append(self.image.copy())
qp = QPainter(self.image)
self.draw_circle(qp) if self.moving else self.draw_point(qp)
self.pressed = self.moving = False
self.update()
def paintEvent(self, event):
qp = QPainter(self)
rect = event.rect()
qp.drawImage(rect, self.image, rect)
if self.moving:
self.draw_circle(qp)
elif self.pressed:
self.draw_point(qp)
def draw_point(self, qp):
qp.setPen(QPen(Qt.black, 5))
qp.drawPoint(self.center)
def draw_circle(self, qp):
qp.setRenderHint(QPainter.Antialiasing)
qp.setPen(QPen(Qt.black, 3, Qt.DashLine))
qp.drawEllipse(self.center, self.radius, self.radius)
def undo(self):
if self.revisions:
self.image = self.revisions.pop()
self.update()
def reset(self):
if self.revisions:
self.image = self.revisions[0]
self.revisions.clear()
self.update()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
w = QWidget()
self.setCentralWidget(w)
canvas = Canvas('photo.png')
grid = QGridLayout(w)
grid.addWidget(canvas)
QShortcut(QKeySequence('Ctrl+Z'), self, canvas.undo)
QShortcut(QKeySequence('Ctrl+R'), self, canvas.reset)
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = MainWindow()
gui.show()
sys.exit(app.exec_())
这是我的班级所在的文件 你需要更多的细节吗
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class Canvas(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image = None
self.pressed = self.moving = False
self.revisions = []
def set_image(self, qimage):
qimage = qimage.scaled(self.size(), Qt.KeepAspectRatio)
self.image = qimage
self.setFixedSize(self.image.width(), self.image.height())
# self.setFixedSize(309, 300)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.pressed = True
self.center = event.pos()
self.update()
def mouseMoveEvent(self, event):
if event.buttons() & Qt.LeftButton:
self.moving = True
r = (event.pos().x() - self.center.x()) ** 2 + (event.pos().y() - self.center.y()) ** 2
self.radius = r ** 0.5
self.update()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.revisions.append(self.image.copy())
qp = QPainter(self.image)
self.draw_circle(qp) if self.moving else self.draw_point(qp)
self.pressed = self.moving = False
self.update()
def paintEvent(self, event):
if self.image:
qp = QPainter(self)
rect = event.rect()
qp.drawImage(rect, self.image, rect)
if self.moving:
self.draw_circle(qp)
elif self.pressed:
self.draw_point(qp)
def draw_point(self, qp):
qp.setPen(QPen(Qt.black, 5))
qp.drawPoint(self.center)
def draw_circle(self, qp):
qp.setRenderHint(QPainter.Antialiasing)
qp.setPen(QPen(Qt.black, 3, Qt.DashLine))
qp.drawEllipse(self.center, self.radius, self.radius)
def undo(self):
if self.revisions:
self.image = self.revisions.pop()
self.update()
def reset(self):
if self.revisions:
self.image = self.revisions[0]
self.revisions.clear()
self.update()
这是我的主GUI的另一个文件
from canvas import *
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
super(ApplicationWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
QShortcut(QKeySequence('Ctrl+Z'), self, Canvas.undo)
QShortcut(QKeySequence('Ctrl+R'), self, Canvas.reset)
def main():
app = QtWidgets.QApplication(sys.argv)
application = ApplicationWindow()
application.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
这是我的班级所在的文件 你需要更多的细节吗
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class Canvas(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image = None
self.pressed = self.moving = False
self.revisions = []
def set_image(self, qimage):
qimage = qimage.scaled(self.size(), Qt.KeepAspectRatio)
self.image = qimage
self.setFixedSize(self.image.width(), self.image.height())
# self.setFixedSize(309, 300)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.pressed = True
self.center = event.pos()
self.update()
def mouseMoveEvent(self, event):
if event.buttons() & Qt.LeftButton:
self.moving = True
r = (event.pos().x() - self.center.x()) ** 2 + (event.pos().y() - self.center.y()) ** 2
self.radius = r ** 0.5
self.update()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.revisions.append(self.image.copy())
qp = QPainter(self.image)
self.draw_circle(qp) if self.moving else self.draw_point(qp)
self.pressed = self.moving = False
self.update()
def paintEvent(self, event):
if self.image:
qp = QPainter(self)
rect = event.rect()
qp.drawImage(rect, self.image, rect)
if self.moving:
self.draw_circle(qp)
elif self.pressed:
self.draw_point(qp)
def draw_point(self, qp):
qp.setPen(QPen(Qt.black, 5))
qp.drawPoint(self.center)
def draw_circle(self, qp):
qp.setRenderHint(QPainter.Antialiasing)
qp.setPen(QPen(Qt.black, 3, Qt.DashLine))
qp.drawEllipse(self.center, self.radius, self.radius)
def undo(self):
if self.revisions:
self.image = self.revisions.pop()
self.update()
def reset(self):
if self.revisions:
self.image = self.revisions[0]
self.revisions.clear()
self.update()
这是我的主GUI的另一个文件
from canvas import *
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
super(ApplicationWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
QShortcut(QKeySequence('Ctrl+Z'), self, Canvas.undo)
QShortcut(QKeySequence('Ctrl+R'), self, Canvas.reset)
def main():
app = QtWidgets.QApplication(sys.argv)
application = ApplicationWindow()
application.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
我想第二个类定义是一个非自愿粘贴,对吗?也就是说,我不确定我是否理解您的代码:除了
drawImage
函数之外,我看不到任何绘画。我只是对它绘画的线条进行了注释,这是一个子文件,我将它导入到具有GUI和其他功能的主文件中,我对它进行了编辑,并添加了load image函数。我仍然看到一个带有缩进的重复类。在提交编辑之前,请按照有关的指导原则回顾您的示例,并检查预览,否则我们将很难理解它。给您,我只是把类和我正在工作的链接放在一起,但没有看到您试图画一个圆,在哪里?你读过有关的文档了吗?而且,你的缩进是错误的;正如我已经建议的,请在提交任何编辑之前检查预览。我们必须能够复制您的代码,粘贴它并尝试运行它。我想第二个类定义是非自愿的粘贴,对吗?也就是说,我不确定我是否理解您的代码:除了drawImage
函数之外,我看不到任何绘画。我只是对它绘画的线条进行了注释,这是一个子文件,我将它导入到具有GUI和其他功能的主文件中,我对它进行了编辑,并添加了load image函数。我仍然看到一个带有缩进的重复类。在提交编辑之前,请按照有关的指导原则回顾您的示例,并检查预览,否则我们将很难理解它。给您,我只是把类和我正在工作的链接放在一起,但没有看到您试图画一个圆,在哪里?你读过有关的文档了吗?而且,你的缩进是错误的;正如我已经建议的,请在提交任何编辑之前检查预览。我们必须能够复制你的代码,粘贴它并尝试运行它。是的,这是完全完美的,你能告诉我重置它或删除圆圈的功能吗?@HassanKhaledBosha你的意思是要能够撤消最后一个圆圈并重置图像吗?顺便说一句,当答案恰当地回答了你的问题时,通常会批准它。我添加了撤销(CTRL+Z)和重置(CTRL+R)功能。是一个在按钮功能中使用的功能。单击按钮可删除圆圈确定我使用了热键快捷键,但您只需将按钮单击信号连接到画布。撤消和画布。相应地重置。是的,这非常完美,你能告诉我重置或删除圆圈的功能吗?@HassanKhaledBosha你的意思是你想撤销最后一个圆圈并重置图像吗?顺便说一句,当答案恰当地回答了你的问题时,通常会批准它。我添加了撤销(CTRL+Z)和重置(CTRL+R)函数。是一个要在按钮功能中使用的函数。单击可删除圆圈OK我使用了热键快捷键,但您只需将按钮单击信号连接到画布。撤消和画布。相应地重置。您必须创建画布实例并将其添加到您的UI中。您必须创建画布实例画布并将其添加到您的UI。