当前位置 : 主页 > 编程语言 > python >

PyQt简单的计算器实例讲解

来源:互联网 收集:自由互联 发布时间:2022-06-18
#coding=utf8 from __future__ import division #导入除法方法,返回标准值 ''' 这个例子是一个对话风格(dialog-style)的应用程序。 对话框风格(dialog-style)意味着该应用程序: 没有菜单条、工具条或
#coding=utf8
from __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_()

运行结果:

PyQt简单的计算器实例讲解_初始化


【文章原创作者:防ddos攻击 http://www.558idc.com/shsgf.html 复制请保留原URL】
网友评论