我正在使用PyQt4构建GUI。目前我有一个OpenGLWidget()
,它在Solver()
的每个第N个时间步中显示几何形状。我添加了新的图形窗口 - GraphWidget()
来绘制“一些有趣的”数据。在Solver()
中,我使用信号刷新Open GL小部件 - self.updateGL()
。我已将现有信号连接到重绘FigureCanvasQTAgg
但未绘制任何内容。
这是 SimulationControlWidget 类
class SimulationControlWidget(self):
self.OpenGLWidget = OpenGLWidget() #opengl widget
self.GraphWidget = GraphWidget() #plot widget with matplotib
# solver in new thread
self.solver = Solver()
self._solver_thread = QThread()
self._solver_thread.start()
self.solver.moveToThread(self._solver_thread)
# signals
#this signal is OK
OKself.solver.solveODE.repaintGL_signal.signal_repaintGL.connect(self.OpenGLWidget.updateGL)
#this signal is not OK
self.solver.solveODE.repaintGL_signal.signal_repaintGL.connect(self.GraphWidget.plot_graph)
这是 GraphWidget 类:
class GraphWidget(QtGui.QWidget):
def __init__(self, MBD_system=[], parent=None, flags=0):
super(GraphWidget, self).__init__(parent)
self.fig = Figure((8.0, 4.0), dpi=100)
self.canvas = FigureCanvas(self.fig)
self.axes = self.fig.add_subplot(111)
# added button to manually execute function plot_graph()
self.plot_button = QtGui.QPushButton("&Show")
self.layout = QtGui.QVBoxLayout(self)
self.layout.addWidget(self.canvas)
self.layout.addWidget(self.plot_button)
self.canvas.draw()
# signal to plot data with button self.plot_button
self.plot_button.clicked.connect(self.plot_graph)
def plot_graph(self):
print 'plotting graph!'
self.axes.cla()
self.axes.plot(np.random.rand(10, 2))
self.canvas.draw()
我遇到的问题是:如果我手动点击按钮self.plot_button
,则执行函数plot_graph()
(正确绘制随机数据,并在eclipse pydev控制台中打印文本plotting_graph!
) 。但是如果我尝试用信号执行函数plot_graph()
,则只在控制台中打印文本plotting_graph!
并且不绘制数据。我还注意到,如果我使用signal,函数plot_graph()
在模拟停止后正在执行(由于信号)。应该是什么解决方案?如果它更有用,我也可以将链接放到整个代码中。我想我必须同步这个...但是如何?