我正在使用Pyside构建基于Qt的GUI。在有权访问QMainWindow(_theMainWindow
)类的特定类中,该类又可以访问其他2个Qt小部件(theScan
& theScanProgress
)我正在尝试{{1}最后一个执行
show()
这很好用,会出现theScanProgress小部件。
但是,当我添加使应用程序进入睡眠状态的行(以及打印语句)时,如下所示
def initiateScan(self):
self._theMainWindow.theScan.theScanProgress.show()
程序似乎在小部件出现之前就进入睡眠状态,就好像def initiateScan(self):
self._theMainWindow.theScan.theScanProgress.show()
print("test")
time.sleep(3)
之前time.sleep(3)
被执行一样
为什么会发生这种情况?
答案 0 :(得分:0)
这是因为处理gui事件的主循环。如果您不使用线程,则一次只能执行一个函数。我强烈怀疑show
会发出一个进入事件队列的信号,该信号又被阻塞,直到当前函数返回。
换句话说,Qt是事件驱动的,它一次只能做一个事件。你所做的就是调用initiateScan
向执行该函数的堆栈添加了一个事件(就像你按下一个按钮,它发出一个信号然后触发了该函数),该函数可以进行一些计算,更改对象的内部状态,并将事件添加到堆栈。 show
下面的内容向所有孩子发出信号,让他们向自己展示自己。要运行该代码,必须等待当前事件(睡眠时的函数)返回。在sleep
期间,由于完全相同的原因,整个gui将无法响应。
[我可能已经玷污了一些艺术术语]
答案 1 :(得分:0)
show
仅调度进度窗口小部件的外观。但是,由于您使用sleep
阻止了主线程,因此主线程在释放之前无法执行计划操作。
你必须使用线程或找到另一种方法等待3秒。