PyQt简单的计算器实例讲解

来源:互联网 发布:windows安全性登录 编辑:程序博客网 时间:2024/06/10 22:47
#coding=utf8from __future__ import division  #导入除法方法,返回标准值'''这个例子是一个对话风格(dialog-style)的应用程序。对话框风格(dialog-style)意味着该应用程序:没有菜单条、工具条或者状态条、只带有一些按钮、也不存在中心widget。相反,“main window-style(主窗口风格)”应用通常包含如下:菜单条、工具条、状态条、实例按钮、一个中心widget(包含其他widget)。这个应用使用两个widgets:一个QTextBrowser----只读的多行文本显示框,用来显示纯文本和HTML一个QLineEdit-----单行文本框,用来显示纯文本在PyQt widgets的所有文本编码格式默认都是Unicode,当需要时可以转换成其他编码格式。本例是个计算机实例:可以像任何GUI应用一样,通过点击(或者双击这取决于平台与设置)它的图标运行。也能通过在控制台启动。一旦程序运行,用户仅仅可以输入数学计算表达到行编辑中,输入完成按回车(Enter或者Return),表达式和计算结果会被添加到QTextBrowser中。当输入无效的表达式或无效的数学运算(例如除零),都会抛出异常,返回错误信息,并把错误信息显示在QTextBrowser中。该示例遵循该模式,将用于所有未来的GUI应用程序:一个form代表一个类、用户交互行为响应作为方法、main是程序最小的部分。在大部分案例中,当用户创建一个顶级(top-level)窗口,该窗口可能是QDialog/QMainWindow/QWidget的子类。QDialog、QMainWindow与PyQt中所有的widget都源于QWidget。使用layout的重要原因之一是:PyQt自动为widget进行布局。尽管在这个实例没有给widget父级,当调用setLayout(),布局管理器将自己小部件的所有权归属于form,并拥有任何嵌套布局本身所有权。这意味着没有布局的小部件是一个顶级窗口。当form被删除时,它的所有子widget和layout也会被以正确的顺序删除。''''''对象所属关系:所有PyQt类都源于QObject,QObject包含所有的widgets,因为QWidget是QObject的子类----可以有一个“parent”。这父子关系用做互补的目的。一个没有父级的widget是一个顶级窗口。一个有父级(通常是另一widget)的widget通常被包含(显示)在它的父级widget中。这种关系被定义为所属关系,父级拥有自己的孩子。PyQt使用父子所属模型来确保。如果父级(一个顶级窗口)被删除,它的所有孩子(窗口包含的所有widget)会自动被删除。为了避免内存泄漏,要确保任何QObject包括所有的QWidget都有一个parent,唯一的例外是顶级窗口。大部分PyQt QObject子类都有构造函数,以一个parent对象作为他们的最后(可选的)参数。但是因为widgets通常不或不需要传递这参数。这是因为对话框中使用的小部件是通过布局管理器布局,当这种情况发生时,它们是自动的反映在他们被布局的小部件上,所以他们最终得到了正确的父母,不要求我们采取任何特别的行动。但由于一些事件,必须明确传递parent-例如当构造一个QObject子类对象,该对象不是一个widget,或者是widget但不被布局(例如dock widget)。最后一点是有可能得到一个Python变量的情况是指不再存在的底层PyQt对象。resize():给定widget的绝对大小setFocus():设置焦点connect():move():给定widget的绝对位置'''import sys  #为了获得sys.argv列表from math import *  #需要一些算术操作需要导入包from PyQt4.QtCore import *from PyQt4.QtGui import *#创建一个继承QDialo的Form类class Form(QDialog):    '''    通过继承QDialog可以获得一个空白的form,    form是一个灰色矩形、一些方便的属性和方法。    例如用户点击X按钮,对话框关闭。    一般,当一个widget被关闭,该widget将完全被隐藏    '''    def  __init__(self,parent=None):        '''        创建一个Form类的__init__()方法,并设置一个参数parent,默认为None,        用super()方法初始化它。       没有父级(parent)的小部件(widget)成为顶级窗口,这是用户想要的form。       需要创建两个小部件并继续引用它们,以便以后在外面访问它们的__init __()。       由于没有给widget父级,这些widget仿佛变成了顶级窗口。       这些widget在初始化之后获得了父级。         '''        super(Form,self).__init__(parent)        '''        一旦运行应用并重置大小,页面中额外的垂直空间被QTextBrowser占据,        这个应用的widget将水平增长。这是通过布局管理器自动处理的。        '''        self.browser=QTextBrowser()        #给QLineEdit一些初始化显示的文本        self.lineedit=QLineEdit("Type an expression and press Enter")        #选则QLineEdit中的文本信息        #这方便用户输入,这些文本信息很容易重写        self.lineedit.selectAll()        #创建一个垂直布局盒子        layout=QVBoxLayout()        #把之前创建的两个空间加到垂直布局盒子里        layout.addWidget(self.browser)        layout.addWidget(self.lineedit)        #把layout放入form中        self.setLayout(layout)        #设置焦点        self.lineedit.setFocus()        self.connect(self.lineedit,SIGNAL("returnPressed()"),self.updateUi)        self.setWindowTitle("Calculate")            def updateUi(self):        try:            #转码为unicode码            text = unicode(self.lineedit.text())            #把文本信息添加大量QTextBroswer中            #通过使用eval(),避免了解析和错误检查的所有工作            self.browser.append("%s = <b>%s</b>" % (text, eval(text)))        except:            #把文本信息添加大量QTextBroswer中            self.browser.append(                    "<font color=red>%s is invalid!</font>" % text)app = QApplication(sys.argv)form = Form()form.show()app.exec_()                            

运行结果:


0 0