在PyQt5中运行模拟 - QGraphicsScene在模拟结束前不会更新

时间:2017-12-24 21:41:04

标签: python qt pyqt pyqt5 simulation

我正在构建一个具有主图像的GUI的应用程序(主要是模拟),这样当用户按下按钮时,该图像每隔一秒左右就会改变并且每次都显示更新的图像(更新是实际上只是在父图像上绘制各种东西)。为了测试,我有一个在我的“开始模拟”插槽中运行的循环,它完成模拟的10个步骤的所有模型更改和图片更新。

因此中央图像应更新10次。但是,它仅在回调返回时在最后更新一个时间。我的基础模型在每一步都正确更新,我在最后看到的图像是第10步的正确图像。

我是Qt的新手,我确定这个问题与小部件/更新相关,但我一直没有运气。

我已经注册到启动模拟按钮的回调,它启动了图像更新过程。 self是QMainWindow

的子类
def start_simulation(self):
  self.map_view.place_initial_population(250, 250)
  for i in range(1, 10):
    self.map_view.simulation_step()
    self.map_view.update()
    time.sleep(1)

map_view类中的相关函数(QGraphicsView的子类):

def simulation_step(self):
  self.load_map()
  self.draw_dot()


def load_map(self):
  self.map_image = QImage("ancient_map_seed1.png")
  self.current_pixmap = QPixmap.fromImage(self.map_image)

  self.map_scene = QGraphicsScene(self)
  self.map_graphics_item = self.map_scene.addPixmap(self.current_pixmap)
  self.setScene(self.map_scene) 


def draw_dot(self):
  founder_pop = self.map_objects.populations[0]
  print("Height: +" + str(founder_pop.x)+ "; width: " + str(founder_pop.y))
  dot = QGraphicsPixmapItem(QPixmap.fromImage(self.red_dot), parent = self.map_graphics_item)
  dot.setPos(founder_pop.x, founder_pop.y)
  new_x = founder_pop.x + random.randint(-5, 5)
  new_y = founder_pop.y + random.randint(-5, 5)
  self.map_objects.populations[0].x = new_x
  self.map_objects.populations[0].y = new_y
  self.map_objects.population_matrix[new_x][new_y] = self.map_objects.population_matrix[founder_pop.x][founder_pop.y]
  self.map_objects.population_matrix[founder_pop.x][founder_pop.y] = self.map_objects.PopulatedTile()

这里可能有一些无操作代码,因为我一直在尝试任何我认为可能在某种程度上相关的功能。我还在上下文中为这些函数移动了一些代码。

全部谢谢!

1 个答案:

答案 0 :(得分:1)

默认情况下,Qt事件处理是同步完成的。这意味着,当您的程序位于特定插槽内时,它不会处理事件。 self.map_view.update()可能只会将一些redraw事件推送到事件队列。但是,这些事件未得到处理。

这是一篇旧的Qt文章,讨论了在长时间计算期间保持Qt应用程序响应的各种方法。

https://doc.qt.io/archives/qq/qq27-responsive-guis.html