init 之后的调用方法不显示应用程序

Calling method after init doesn't show application

我有一个简单的 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_())

对于这些情况,一个好的选择总是使用 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()