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

时间:2018-02-06 00:53:49

标签: python pyside

我想要显示一个简单的PySide Gui,但是目前有一个阻塞任务是一个很长的过程,用项目填充下拉列表。这意味着在下拉列表完成填充之前,UI不会显示。我想知道有没有办法在尝试填充列表之前强制显示UI。我更喜欢对话节目,所以用户知道他们在假设它崩溃之前打开了工具。

enter image description here

我使用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_())

1 个答案:

答案 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()