MainDialog()循环如何工作

时间:2016-03-17 17:44:57

标签: python qt python-2.7

我试图理解我的“main.py”循环是如何工作的。它基于网络上的示例,关于PySide和Qt Designer,用于实现Python GUI。

代码是:

#***********************************#
# Python Libraries                  #
#***********************************#
from PySide.QtCore import *
from PySide.QtGui import *
import sys
import time
#***********************************#
# Python files                      #
#***********************************#
import Gui
from server import *

class MainDialog(QDialog, Gui.Ui_TCPServer):

    def __init__(self, parent=None):

        super(MainDialog, self).__init__(parent)
        self.setupUi(self)

        self.connect(self.ConnectBt, SIGNAL("clicked()"), self.ConnectBt_clicked)
        self.connect(self.QuitBt, SIGNAL("clicked()"), self.QuitBt_clicked)
        self.connect(self.DisconnectBt, SIGNAL("clicked()"), self.DisconnectBt_clicked)

        print "NOW HERE\r\n"

    def ConnectBt_clicked(self):
        self.ConnectBt.setText("Connecting...")
        self.server_connect()
        print "THEN HERE\r\n"

    def QuitBt_clicked(self):
        self.close()

    def DisconnectBt_clicked(self):
        self.ConnectBt.setText("Connect")
        self.server_off = ChronoRequestHandler()
        self.server_off.finish()

    def server_connect(self):
        self.server_on = ServerStart()
        self.server_on.try_connect()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = MainDialog()
    print "HERE\r\n"
    form.show()
    app.exec_()
    print "END\r\n"

当我打电话给“main.py”时,我会看到“现在在这里”和“那么在这里”。当我按下'ConnectBt'时,我会得到“那么”的印刷品。

但在此之后,周期仍然存在?它是否会返回 init ,如果是这样,我不应该再次打印“NOW HERE”?它是否会返回主要,如果是这样,我不应该得到“HERE”的印刷品吗?请解释一下......

当我按下'QuitBt'时,我得到了“END”的印刷品......我很困惑!

感谢。

1 个答案:

答案 0 :(得分:0)

我认为你应该更清楚地了解对象编程和事件是如何工作的。

在最后一个if语句(从例如终端调用脚本时运行的底部代码)中,您创建了一个QApplication的应用程序对象实例。

之后创建表单,MainDialog的实例,它是您在上面定义的类(从两个类继承方法,属性等,QDialog,Gui.Ui_TCPServer)。

通过

form = MainDialog()

你运行__init__,打印"现在这里"并且走出那个方法。请检查Python中__init__的作用。 why-do-we-use-init-in-python-classes

在结束之前,您调用app实例的exec()方法。它包含一个循环,以便您的界面收集和处理事件。请参阅下面的QApplication.exec()文档。

当您按下“ConnectBt”时,按钮,你调用ConnectBt_clicked()方法,它做东西(连接服务器)并打印"那么这里"。

以同样的方式,当您按下QuitBt时,您调用QuitBt_clicked(),它会关闭连接并让代码打印" END"。

我还建议您阅读有关您正在使用的类的更多文档。他们将解释为什么不同的按钮"链接" /作为回调方法ConnectBt_clicked(),def QuitBt_clicked()和DisconnectBt_clicked()。按钮触发这些回调的机制在这些类中实现的代码中是隐含的。

QApplication Class Reference: exec_

  

int QApplication.exec_()

     

进入主事件循环并等待直到调用exit(),然后   返回设置为exit()的值(如果exit()为0则为0)   通过quit()调用。

     

必须调用此函数才能启动事件处理。该   主事件循环从窗口系统接收事件并发送   这些应用程序小部件。

     

通常,在调用exec()之前不能进行任何用户交互。   作为一种特殊情况,之前可以使用像QMessageBox这样的模态小部件   调用exec(),因为模态小部件调用exec()来启动本地   事件循环。

     

使您的应用程序执行空闲处理,即执行a   特殊功能,只要没有待处理事件,请使用QTimer   0超时。可以实现更高级的空闲处理方案   使用processEvents()。

     

我们建议您将清理代码连接到aboutToQuit()   信号,而不是把它放在你的应用程序的main()函数中。   这是因为,在某些平台上,QApplication.exec()调用可能会   不回来例如,在Windows平台上,当用户登录时   关闭,系统在Qt关闭所有顶级后终止进程   视窗。因此,无法保证应用程序将具有   时间退出事件循环并在main()结束时执行代码   在QApplication.exec()调用之后的函数。

     

另请参阅quitOnLastWindowClosed,quit(),exit(),processEvents()和   QCoreApplication.exec()。