self.dialogBox.close()
self.state = "processing"
self.__clearLayout(self.layout)
print(1)
self.controller.process()
我正在运行以下代码。对话框是一个PyQt对话框,self.state
只是一个当前状态,self.__clearLayout
清除PyQt小部件的当前布局,print(1)
用于调试,而self.controller.process()
是处理事情的程序,需要一段时间。我的目标是清除UI,然后让我的程序进程,但它是无序的。它打印1
并开始处理,这告诉我它是有序的,但是UI直到处理完成后才开始设置。关于如何解决这个问题有什么建议吗?你知道吗
def processUi(self):
self.dialogBox.close()
self.state = "processing"
self.__clearLayout(self.layout)
#label
processingLabel = QtWidgets.QLabel()
processingLabel.setMaximumSize(500, 500)
processingLabel.setFont(QtGui.QFont("Mono", 16))
processingLabel.setText("Processing...may take a few minutes.")
#set the current layout
currentLayout = QtWidgets.QVBoxLayout()
currentLayout.setContentsMargins(0,0,0,0)
currentLayout.addStretch()
currentLayout.addWidget(processingLabel)
currentLayout.addStretch()
self.layout.addStretch()
self.layout.addLayout(currentLayout)
self.layout.addStretch()
#thread for processing
processing = multiprocessing.Process(target=self.controller.process, args=())
processing.start()
processing.join()
self.finishedUi()
这是完整的代码。目标是在处理工作时设置您看到的ui代码,并且在处理完成后调用finishedUi。你知道吗
我假设您的clear布局方法与我在this answer中给出的方法相同。你知道吗
如果是这样,问题就出在
deleteLater
,它会延迟删除,直到控件返回到事件循环。无法强制处理延迟删除事件(例如QApplication.processEvents()
将不起作用)。相反,需要使用sip module直接删除小部件:如果使用多线程,就不必为
sip.delete
操心,因为任何挂起的删除事件都将在线程启动后立即处理。下面是一个简单的演示,演示如何使用线程进行非阻塞处理:相关问题 更多 >
编程相关推荐