我有一个问题,我无法在一段时间内弄清楚。我有一个主窗口应用程序和一个QDialog,单击其中一个按钮后应弹出该对话框,但是QDialog上的show()方法似乎正在等待连接到“ clicked()”信号的函数结束!
我希望对话框在调用QDialog.show()方法之后立即显示,而不是在该函数中的所有其他代码指令之后显示...

当然,在我的代码中,我将用更复杂的代码替换sleep(5)部分,但这说明了问题,我认为放置在该代码中的代码与该问题无关,我认为(数据库连接和更新)
更具体:

# -*- coding: utf-8 -*-
import sys

import PyQt4
from PyQt4 import QtCore, QtGui
from twython import Twython, TwythonError
from project import Ui_MainWindow
from time import sleep
import psycopg2, globalvals, updater
import updating, noconnection

class UpWindow(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent, QtCore.Qt.WindowStaysOnTopHint)
        self.ui = updating.Ui_updating()
        self.ui.setupUi(self)

class NoConnection(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent, QtCore.Qt.WindowStaysOnTopHint)
        self.ui = noconnection.Ui_noConnection()
        self.ui.setupUi(self)

        QtCore.QObject.connect(self.ui.noConnectionClose, QtCore.SIGNAL("clicked()"), self.close)

class MyCounter(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.noConn = NoConnection(self)
        self.upWin = UpWindow(self)

        QtCore.QObject.connect(self.ui.refreshButton,QtCore.SIGNAL("clicked()"), self.refresh)
        QtCore.QObject.connect(self.ui.manageButton,QtCore.SIGNAL("clicked()"), self.manage)

    def refresh(self):
        self.upWin.show()
        self.upWin.show
        self.upWin.setVisible(True)
        self.setEnabled(False)
        self.upWin.setEnabled(True)
        #Thats the issue - the sleep instruction is being held
        #BEFORE the showing of upWin QDialog
        sleep(5)

    def manage(self):
        print 'ok'



if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyCounter()
    myapp.upcontent()
    myapp.show()
    sys.exit(app.exec_())

最佳答案

可以将任何Qt程序视为协作多任务系统。图形和事件通常由主循环处理。您不希望在任何插槽中停留太长时间,因为在此期间,该库不会处理信号(例如,单击按钮,重新绘制以及其他内容)。

如果您想进行一些繁重的处理,或者在程序其余部分忙碌时需要等待资源的任何事情,请使用QThread

另一种选择是在qApp.processEvents()之前(或要替换它的任何代码)用qApp(在QtGui中可以找到sleep(5))强制事件处理。

编辑:现在,请记住,强制事件处理只会显示您要弹出的QDialog。如果不再次调用qApp.processEvents()或从插槽返回,您将无法对其进行任何操作(请记住,不进行任何事件处理)。

关于python - QDialog.show()方法的 react 延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21592202/

10-12 22:12