Pyqt5等待widget可见

2024-07-03 07:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法来等待QWidget完全显示后再调用函数。我有两个窗口:父母和孩子。在

父窗体是一个带有按钮的窗口,它调用openChild,该按钮隐藏父窗体,显示子窗体,然后执行子窗体的主函数busyFunc

from PyQt5 import QtCore, QtGui, QtWidgets
from Child import Child_Form
import sys

class Parent_Form(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setupUi(self)
        self.Child = Child_Form(self)

    def setupUi(self, Parent):
        Parent.setObjectName("Parent")
        Parent.resize(400, 300)
        self.nextWindow = QtWidgets.QPushButton(Parent)
        self.nextWindow.setGeometry(QtCore.QRect(150, 120, 91, 31))
        self.nextWindow.setObjectName("nextWindow")

        self.retranslateUi(Parent)
        QtCore.QMetaObject.connectSlotsByName(Parent)

    def retranslateUi(self, Parent):
        _translate = QtCore.QCoreApplication.translate
        Parent.setWindowTitle(_translate("Parent", "Parent Window"))
        self.nextWindow.setText(_translate("Parent", "Next Window"))

        self.nextWindow.clicked.connect(self.openChild)

    def openChild(self):
        self.hide()
        self.Child.show()
        self.Child.busyFunc()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Parent_Form()
    ex.show()
    sys.exit(app.exec_())

子窗体只有一个标签和一个文本编辑的滚动区域。在

^{pr2}$

问题是当busyFunc被调用时(实际的函数是一个巨大的程序,为了清楚起见,我省略了它。我用一个循环来模拟这个问题)。在

父项被隐藏,但子项在busyFunc完成之前看起来是这样的。在

如何使子加载完全像这样,然后执行busyFunc?在


Tags: importselfformchilddefsys窗体translate
1条回答
网友
1楼 · 发布于 2024-07-03 07:20:44

一种解决方案是在一段时间后通过计时器启动busyFunc函数。在

def openChild(self):
    self.hide()
    self.Child.show()
    QtCore.QTimer.singleShot(100, self.Child.busyFunc)

问题是在运行此函数时接口被阻塞,要解决这个问题,建议在线程上运行该任务

^{pr2}$

显然,由于busyFunc的当前代码不与GUI交互,ie不更新GUI的任何值,因此没有问题,但是如果这个代码必须更新GUI的一些数据,它必须通过信号来完成,而不是直接:

class Thread(QtCore.QThread):
    signal = QtCore.pyqtSignal(str)
    signal2 = QtCore.pyqtSignal(list)
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)

    def run(self):
        self.signal.emit("start")
        for i in range(0, 1000000000):
            pass
        self.signal.emit("finish")
        self.signal2.emit([1, 2, 3, 4])

class Child_Form(QtWidgets.QWidget):
    def __init__(self, Parent_Form):
        [...]
    def busyFunc(self):
        self.thread = Thread(self)
        self.thread.signal.connect(lambda text: self.textEdit.append(text))
        self.thread.signal2.connect(lambda l: print(l))
        self.thread.start() 

class Parent_Form(QtWidgets.QWidget):
    def __init__(self):
        [...]
    def openChild(self):
        self.hide()
        self.Child.show()
        self.Child.busyFunc()

相关问题 更多 >