0

我正在使用 Pyside 构建一个基于 Qt 的 GUI。在可以访问 QMainWindow ( ) 类的特定类中,_theMainWindow该类又可以访问 2 个其他 Qt 小部件 ( theScan& theScanProgress) 我试图show()通过执行最后一个

def initiateScan(self):
    self._theMainWindow.theScan.theScanProgress.show()

这工作得很好,出现了 theScanProgress 小部件。

但是,当我添加使应用程序休眠的行(和打印语句)时,如下所示

def initiateScan(self):
    self._theMainWindow.theScan.theScanProgress.show()
    print("test")
    time.sleep(3)

程序似乎在小部件出现之前进入睡眠状态,即好像time.sleep(3)之前执行过self._theMainWindow.theScan.theScanProgress.show()

任何想法为什么会发生这种情况?

4

2 回答 2

0

show only schedules the appearance of the progress widget. But since you are blocking the main thread with your sleep, the main thread cannot perform the scheduled action until you release it.

You have to use threads or find another way to wait 3 seconds.

于 2013-05-22T14:22:08.290 回答
0

这是因为处理 gui 事件的主循环。如果您不使用线程,则一次只能执行一个函数。我强烈怀疑它show会发出一个信号,该信号会进入事件队列,而事件队列又会被阻塞,直到当前函数返回。

换句话说,Qt 是事件驱动的,它一次只能做一个事件。你所做的任何调用都会initiateScan向堆栈添加一个执行函数的事件(就像你按下一个按钮,它发出一个信号,然后触发函数),那个函数可以做一些计算,改变你的内部状态对象,并将事件添加到堆栈中。下面是show向所有孩子发出信号,让他们向他们展示自己。要运行该代码,它必须等待当前事件(您的睡眠函数)返回。sleep由于完全相同的原因,在整个 gui 中将无响应。

[我可能扼杀了一些艺术术语]

于 2013-05-22T14:19:23.630 回答