我想要显示一个简单的PySide Gui,但是目前有一个阻塞任务是一个很长的过程,用项目填充下拉列表。这意味着在下拉列表完成填充之前,UI不会显示。我想知道有没有办法在尝试填充列表之前强制显示UI。我更喜欢对话节目,所以用户知道他们在假设它崩溃之前打开了工具。
我使用Qt,因为我的应用程序需要在PySide和PySide2中运行。我最初尝试使用qApp.processEvents()但它似乎在Qt包装器中不可用,或者我可能已经遗漏了一些东西。如果你知道等价物是什么,我可以将过程事件作为解决方案。 (可选)如果有一种优雅的方式从后台线程以某种方式填充列表......
from Qt import QtGui, QtCore, QtWidgets
class Form(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.resize(200,50)
self.items = QtWidgets.QComboBox()
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.items)
self.setLayout(layout)
# init
self.long_process()
def long_process(self):
for i in range(30000):
self.items.addItem('Item {}'.format(i))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = Form()
form.show()
sys.exit(app.exec_())
答案 0 :(得分:1)
这些案例的一个好选择是始终使用QTimer
:
class Form(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
[...]
# init
timer = QtCore.QTimer(self)
timer.timeout.connect(self.on_timeout)
timer.start(0)
def on_timeout(self):
self.items.addItem('Item {}'.format(self.counter))
self.counter += 1
if self.counter == 30000:
self.sender().stop()