在python中交换对象(小部件)中的数据(使用pyqt)

时间:2014-03-03 12:52:07

标签: python oop pyqt pyqt4

我找不到解决以下问题的方法。这是主文件:

main_window.py

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        #    MBD system
        self.MBDsystem = MBDsystem(folder_name = "dynamic_system_1")

        #    sets opengl widget in central widget position
        self.OpenGLWidget = OpenGLWidget(folder_name = MBS_folder_name, MBD_system = self.MBDsystem)
        self.setCentralWidget(self.OpenGLWidget)

我创建了一个对象self.MBDsystem,其中包含多个对象列表,即:实体列表(及其属性),力列表......

计划是将创建的对象(及其数据)执行计算并在self.OpenGLWidget中显示每个(例如)第10步。

opengl_widget.py

class OpenGLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None, folder_name = None, MBD_system = None):

    QtOpenGL.QGLWidget.__init__(self, parent)
    #    init GL
    def initializeGL(self):
        #    background color - default color
        glClearColor(0, 0, 0, 1)
        ....

    #   display geometry
    def paintGL(self):
        #   drawing is done here
        ....

我想知道如何解决这个问题,因为 main_window.py 是GUI,它会连续运行,OpenGLWidget。 我希望计算是以不同的方法(和文件,即 solver.py 中的solve())完成的,为了清楚起见,当计算解决每隔10步时OpenGLWidget显示解决方案。

1 个答案:

答案 0 :(得分:1)

如果solve()位于不同的文件中,请导入该模块,然后根据需要进行初始化 通过计时器调用solve()paingGL()。有关实现此目的的几种方法,请参阅QTimer docs,但最简单的方法是使用QObject::startTimer()运行OpenGLWidget::timerEVent(),同时调用solve()paingGL(),但是间隔时间不同。例如,您可以在每次调用solve()时拨打timerEvent(),但只在每次拨打第10次电话时调用paintGL()

    import solver

    class OpenGLWidget(QtOpenGL.QGLWidget):
        def __init__(self, parent=None, folder_name = None, MBD_system = None):
            QtOpenGL.QGLWidget.__init__(self, parent)
            self.solveCount = 0
            solver.init()
            interval = 10 # milliseconds
            self.startTimer(10)

        def timerEvent(self, event):
            solver.solve()
            self.solveCount += 1
            if self.solveCount > 10:
                 self.paintGL()
                 self.solveCount = 0

如果间隔为0,则仅在GUI不忙时调用timerEvent()(它相当于wxPython和其他GUI API中的空闲回调)。

正如该文档页面所述,您还可以在solve()中运行QThread。您必须将调用同步到paintGL(),以便solve()paintGL正在读取数据的同时不写入数据。这种复杂性仅在solve()对时间步骤非常敏感时才有用,即便如此,还有其他方法可以做到这一点。例如,当用户调整窗口大小时,GUI会不停地忙碌:如果用户在调整大小时保持窗口边框5秒钟,则很可能在5秒钟内不会调用timerEvent()。然后你的解决方案必须将自上次调用(5秒)后的时间步长细分为N个较小的步骤(每步10毫秒的500步)。