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

问题描述 投票:1回答:1

我有一个简单的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_())
python pyside
1个回答
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()
© www.soinside.com 2019 - 2024. All rights reserved.