【发布时间】:2019-06-01 14:19:13
【问题描述】:
我是 Qt 的新手,我正在尝试做一个我以前在 tkinter 中做过的程序来学习如何使用它。我在 Qt 窗口中嵌入了一个 FigureCanvasQtAgg。我已经在上面绘制了东西。现在我想在用户单击鼠标时在此画布上绘制一个圆圈。
我在 Tkinter 上所做的就是使用:
self.canvas.get_tk_widget().create_oval()
有没有一种简单的方法可以在 PySide2 中获得相同的结果?
这是我尝试过的更简单的代码:
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
import numpy as np
import sys
class MyPaintWidget(QWidget):
def __init__(self):
super().__init__()
layout_canvas = QVBoxLayout()
self.fig = plt.gcf()
plt.plot(np.cos([i for i in np.arange(0, 10, 0.1)]))
self.canvas = FigureCanvas(self.fig)
self.canvas.mpl_connect('button_press_event', self._on_left_click)
layout_canvas.addWidget(self.canvas)
self.setLayout(layout_canvas)
def _on_left_click(self, event):
print(event.xdata, event.ydata)
qp = QPainter()
qp.drawEllipse(QPointF(event.x, event.y), 10, 10)
qp.end()
self.canvas.draw()
if __name__=="__main__":
app = QApplication(sys.argv)
w = MyPaintWidget()
w.show()
app.exec_()
我在 tkinter 中所做的事情(当我点击画布时,会出现一个绿点):
import tkinter as tk
import tkinter.ttk as ttk
import numpy as np
import sys
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
import matplotlib.pyplot as plt
class MainFrame(ttk.Frame):
def __init__(self, master):
ttk.Frame.__init__(self, master)
self.master = master
self.fig = plt.gcf()
plt.plot(np.cos([i for i in np.arange(0, 10, 0.1)]))
self.canvas = FigureCanvasTkAgg(self.fig, master=self.master) # A tk.DrawingArea.
self.canvas.get_tk_widget().grid(row=0, column=0)
self.canvas.draw()
self.canvas.mpl_connect('button_press_event', self._on_left_click)
def _on_left_click(self, event):
self._add_point(event.x, event.y)
def _add_point(self, x, y):
self.canvas.get_tk_widget().create_oval(x - 4, self.canvas.get_tk_widget().winfo_height() - (y - 4), x + 4,
self.canvas.get_tk_widget().winfo_height() - (y + 4), fill='green')
if __name__=="__main__":
window = tk.Tk()
main_frame = MainFrame(window)
window.mainloop()
有什么想法可以在 QT 中得到这个结果吗?谢谢!
【问题讨论】:
标签: python matplotlib pyside2