我正在构建一个具有主图像的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()
这里可能有一些无操作代码,因为我一直在尝试任何我认为可能在某种程度上相关的功能。我还在上下文中为这些函数移动了一些代码。
全部谢谢!
答案 0 :(得分:1)
默认情况下,Qt事件处理是同步完成的。这意味着,当您的程序位于特定插槽内时,它不会处理事件。 self.map_view.update()
可能只会将一些redraw
事件推送到事件队列。但是,这些事件未得到处理。
这是一篇旧的Qt文章,讨论了在长时间计算期间保持Qt应用程序响应的各种方法。