【问题标题】:PyQt run time issuePyQt 运行时问题
【发布时间】:2012-03-09 01:39:51
【问题描述】:

我希望我的代码通过显示 qtwidget 然后运行 ​​forloop 来运行, 但它运行 forloop 然后向我显示我的小部件。为什么是这样?

class tes(QWidget):

    def __init__(self):
        super(tes, self).__init__()
        self.initUI()
        for i in range (1000000):
            print("s")

    def initUI(self):
        t = QTableWidget(8,8,self)        
        self.show()
        self.resize(1000,1000)
        t.setGeometry(0,0,500,500)
        t.show()

def main():
    app = QApplication(sys.argv)
    t = tes()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

【问题讨论】:

  • 那是因为“显示”发生在app.exec_() 行(即主循环开始时)。我想你需要澄清你真正想要做什么。

标签: python qt pyqt


【解决方案1】:

在循环之前添加QApplication.processEvents()。您的小部件将显示,但无响应。要使应用程序响应,请在循环的某些步骤中添加 processEvents() 调用。

例子:

def __init__(self):
    super(tes, self).__init__()
    self.initUI()
    QApplication.processEvents()
    for i in range (1000000):
        if not i % 3:  # let application process events each 3 steps.
            QApplication.processEvents()
        print("s")

【讨论】:

  • 更具体地说,当您调用self.initUI() 时,正在生成的事件(例如showEvent)正在排队到事件队列中,但事件循环尚未开始。当您调用processEvents() 时,您是在强制它手动清除队列。
【解决方案2】:

这是因为你在 tes 对象初始化期间执行了 for 循环之后运行了 app.exec_()

【讨论】:

    【解决方案3】:

    小部件仅在应用程序运行时显示,而不是在其初始化时显示。你到底想在循环中做什么?将它连接到信号或在事件中处理它可能会更好,但这完全取决于您要达到的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多