PyQt4 - (2) 第一印象 (pyqt的入门)

http://www.blogjava.net/glorywine/archive/2008/06/21/206729.html

最简单的example     下面的示例会非常的简单,仅仅显示一个小窗口,但是将来我们可以通过这个小窗口做很多事情。我们可以对它进行缩放,最大化,最小化。而这些就需要比较多的代码了。但是开发人员已经帮我们完成了这些功能,因为这些功能在大多场合都会使用到,所以没有必要让我们重复。PyQt是一个高级别的工具库,如果使用级别相对较低的库开发下面的功能,就非常可能需要更多的代码了。

1#!/usr/bin/python
 2
 3# simple.py
 4
 5import sys
 6from PyQt4 import QtGui
 7
 8app = QtGui.QApplication(sys.argv)
 9
10widget = QtGui.QWidget()
11widget.resize(250, 150)
12widget.setWindowTitle('simple')
13widget.show()
14
15sys.exit(app.exec_())

下面对代码进行分析

import sys from PyQt4 import QtGui

     这里,我们导入了必要的模块,PyQt4的基本模块都在QtGui中。

app = QtGui.QApplication(sys.argv)

     每一个PyQt4程序都必须创建一个application对象,application类位于QtGui模块中。sys.argv传入命令行参数。Python脚本可以通过shell运行,这样我们就可以对程序的启动进行控制。

widget = QtGui.QWidget()

     QWidget是PyQt4中所有用户接口对象的基类,我们使用QWidget默认的构造方法来创建QWidget对象,默认的构造方法没有指定父控件,如果一个widget没有指定父控件,那么我们就称他为一个window。

widget.resize(250, 150)

resize()方法调整widget的大小,在这里我们设定宽度为250px,高度为150px。

widget.setWindowTitle('simple')

setWindowTitle()方法设置了窗口的title,title在titlebar中显示。

widget.show()

调用show()方法将窗口显示出来。

sys.exit(app.exec_())

最后,就会进入application的事件循环。事件处理就从这里开始,循环不断的从窗口接受需要处理的事件,然后将其分发给相应的时间处理方法。通过调用exit()方法或者销毁widget来终止事件循环,调用sys.exit()方法确保了程序可以明确的退出,也就是程序退出后会告知系统。 也许你会问,为什么exec_()方法最后会有一个下划线?问得非常好,这完全是因为exec是python的一个关键字,所以我们不得不使用exec_来代替。

图1:simple 添加图标 应用程序的图标一般就是一个在程序标题栏左上角显示的小图片,下面的例子我们展示如何使用PyQt4来显示图标,同时引入一些新的方法。

 1 #!/usr/bin/python  2  3 # icon.py  4  5 import sys  6 from PyQt4 import QtGui  7  8 class Icon(QtGui.QWidget):  9 def __init__(self, parent=None): 10         QtGui.QWidget.__init__(self, parent) 11 12         self.setGeometry(300, 300, 250, 150) 13         self.setWindowTitle('Icon') 14         self.setWindowIcon(QtGui.QIcon('icons/web.png')) 15 16 app = QtGui.QApplication(sys.argv) 17 icon = Icon() 18 icon.show() 19 sys.exit(app.exec_())

    程序使用的是类似C语言的过程式风格,Python同时支持过程式和面向对象式的编程风格。需要注意的是,在使用PyQt4时,意味着面向对象编程。

class Icon(QtGui.QWidget): def __init__(self, parent=None):         QtGui.QWidget.__init__(self, parent)

    面向对象编程中最重要的三个要素就是类(classes),数据(data)和方法(methods)。首先我们建立一个类叫做Icon,他从QtGui.QWidget继承而来。这就意味着,我们必须要两次调用构造方法,一个是Icon类的,另一个是父类的。

self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon')       self.setWindowIcon(QtGui.QIcon('icons/web.png'))

    上面三个方法都是从父类继承而来,即QtGui.QWidget。setGeometry()在这里做两件事情,一是指定了窗口在屏幕中的位置,二就是指定了窗口的大小。前面两个参数是x和y坐标,后面两个是窗口的width和height。最后一个方法给窗口指定了一个图标,我们需要首先创建一个QIcon对象,而QIcon接受一个参数指明图标的路径。

图2:Icon 展示信息提示(tooltip)     我们可以使用PyQt4给任何的部件添加信息提示功能。

 1 #!/usr/bin/python  2  3 # tooltip.py  4  5 import sys  6 from PyQt4 import QtGui  7 from PyQt4 import QtCore  8  9 class Tooltip(QtGui.QWidget): 10 def __init__(self, parent=None): 11         QtGui.QWidget.__init__(self, parent) 12 13         self.setGeometry(300, 300, 250, 150) 14         self.setWindowTitle('Tooltip') 15 16         self.setToolTip('This is a <b>QWidget</b> widget') 17         QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10)) 18 19 app = QtGui.QApplication(sys.argv) 20 tooltip = Tooltip() 21 tooltip.show() 22 app.exec_()

    在这个例子中,我们给QWidget提供了信息提示。

self.setToolTip('This is a <b>QWidget</b> widget')

    使用setTooltip()来创建一个tooltip,值得高兴的是,我们可以使用富文本格式(rich text formatting)。

QtGui.QToolTip.setFont(QtGui.QFont('Courier New', 10))

    由于QToolTip默认的字体看起来很糟糕,所以我们对之进行一些改进。

图3:Tooltip 关闭窗口     之前的例子中,我们关闭程序都是使用标题栏上的X按钮进行关闭的。下面的例子里,我们使用编程的方式来关闭窗口。而在这里,我们就要开始了解一些Qt中非常重要的概念了,信号(signals)和槽(slots)。     下面一行是QPushButton的构造方法。

QPushButton(string text, QWidget parent = None)

    参数text是在按钮上显示的文本,parent是按钮的父容器。

 1 #!/usr/bin/python  2  3 # quitbutton.py  4  5 import sys  6 from PyQt4 import QtGui, QtCore  7  8 class QuitButton(QtGui.QWidget):  9 def __init__(self, parent=None): 10         QtGui.QWidget.__init__(self, parent) 11 12         self.setGeometry(300, 300, 250, 150) 13         self.setWindowTitle('Icon') 14 15         quit = QtGui.QPushButton('Close', self) 16         quit.setGeometry(10, 10, 60, 35) 17 18         self.connect(quit, QtCore.SIGNAL('clicked()'), \ 19                      QtGui.qApp, QtCore.SLOT('quit()')) 20 21 app = QtGui.QApplication(sys.argv) 22 qb = QuitButton() 23 qb.show() 24 sys.exit(app.exec_())

quit = QtGui.QPushButton('Close', self) quit.setGeometry(10, 10, 60, 35)

     在QWidget上我们创建了一个按钮,就像在屏幕中创建一个QWidget一样。

self.connect(quit, QtCore.SIGNAL('clicked()'), \              QtGui.qApp, QtCore.SLOT('quit()'))

     正如前面所说,PyQt4的事件处理时间里在信号(signals)和槽(slots)机制上的。如果我们点击了按钮,就发射了信号clicked()方法。槽可以是PyQt槽,也可以是任何python中可调用的方法。通过使用QtCore.QObject.connect()方法将信号和槽链接起来。在我们的例子中,使用的槽是PyQt中预先定义的quit()槽。就好象sender和receiver一样,在两个对象之间进行交流。在上面的例子里,sender就是按钮,receiver就是application对象。

图4:quit button 对话框     默认情况下,如果我们点击了标题栏的X按钮,就会将窗口关闭,而有些时候,需要修改这样的行为。比如说在文本编辑器中,如个要关闭一个正在修改的文件,就会弹出一个对话框来确认。

 1 #!/usr/bin/python  2  3 # messagebox.py  4  5 import sys  6 from PyQt4 import QtGui  7  8 class MessageBox(QtGui.QWidget):  9 def __init__(self, parent=None): 10         QtGui.QWidget.__init__(self, parent) 11 12         self.setGeometry(300, 300, 250, 150) 13         self.setWindowTitle('message box') 14 15 def closeEvent(self, event): 16         reply = QtGui.QMessageBox.question(self, 'Message', \ 17 'Are you sure to quit?',\ 18                                            QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) 19 if reply == QtGui.QMessageBox.Yes: 20             event.accept() 21 else: 22             event.ignore() 23 24 25 app = QtGui.QApplication(sys.argv) 26 mb = MessageBox() 27 mb.show() 28 sys.exit(app.exec_())

    如果要关闭QWidget,QCloseEvent时间就会产生。要修改QWidget的默认行为,就需要重载父类中的closeEvent()方法。

reply = QtGui.QMessageBox.question(self, 'Message', \ 'Are you sure to quit?',\                                            QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

    在这里,显示了两个按钮的对话框,Yes和No。第一个string参数出现在标题栏上,第二个string参数显示在对话框中。在reply中保存了返回值。

if reply == QtGui.QMessageBox.Yes:     event.accept() else:     event.ignore()

    对返回值进行比较,如果点击了Yes按钮,就接受事件,关闭窗口,相反就忽略事件。

图5:message box 窗口居中     下面的代码展示了如何将创建的窗口在屏幕中居中。

 1 #!/usr/bin/python  2  3 # center.py  4  5 import sys  6 from PyQt4 import QtGui  7  8 class Center(QtGui.QWidget):  9 def __init__(self, parent=None): 10         QtGui.QWidget.__init__(self, parent) 11 12         self.setWindowTitle('center') 13         self.resize(250, 150) 14         self.center() 15 16 def center(self): 17         screen = QtGui.QDesktopWidget().screenGeometry() 18         size = self.geometry() 19         self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2) 20 21 22 app = QtGui.QApplication(sys.argv) 23 c = Center() 24 c.show() 25 sys.exit(app.exec_())

self.resize(250, 150)

    将窗口大小调整为宽250px,高150px。

screen = QtGui.QDesktopWidget().screenGeometry()

    获得显示器的分辨率。

size = self.geometry()

    获得QWidget的大小。

self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)

    将窗口移动到屏幕中央。

posted on 2008-06-21 23:58 glorywine 阅读(4433) 评论(0) 编辑 收藏 所属分类: Python

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hotqin888的专栏

网页html web直接打开cad文件dwg格式等的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

4181
来自专栏菩提树下的杨过

Flash/Flex学习笔记(4):如何打开网页及Get/Post数据

flash终究只是客户端技术,所以很多时候还是需要与服务端技术(比如asp,asp.net,jsp,php之类)进行数据交互的,下面的代码演示了如何在flash...

2197
来自专栏james大数据架构

在ASPNET中使用JS集锦

(一).确认删除用法: 1. BtnDel.Attributes.Add("onclick","return confirm('"+"确认删除?"+"')")...

2147
来自专栏.NET开发者社区

C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色

在利用C#开发Winform应用程序的时候,我们有可能使用RichTextBox来实现实时显示应用程序日志的功能,日志又分为:一般消息,警告提示 和错误等类别。...

2776
来自专栏Coding迪斯尼

实现盒子动画和键盘特效

1022
来自专栏web开发

canvas实现验证码功能

我们在做一些后台系统登录功能的时候,一般都会用到验证码,最多的就是后台生成的验证码图片返回给前端的。也可以不调用后端接口,前端使用canvas直接生成验证码。

1242
来自专栏Windows Community

Extensions in UWP Community Toolkit - Overview

概述 UWP Community Toolkit  中有一个 Extensions 的集合,它们可以帮助开发者实现很多基础功能,省去自己造轮子的过程,本篇我们先...

38612
来自专栏全栈

基于iView的列表组件封装

8222
来自专栏林德熙的博客

win10 uwp 渲染原理 DirectComposition 渲染 例子创建工程如何写显示CompositionSurfaceBrush

本文来告诉大家一个新的技术DirectComposition,在 win7 之后(实际上是 vista),微软正在考虑一个新的渲染机制。

2121
来自专栏Windows Community

Extensions in UWP Community Toolkit - ListViewExtensions

概述 UWP Community Toolkit Extensions 中有一个为 ListView 提供的扩展 - ListViewExtensions,本篇...

3336

扫码关注云+社区

领取腾讯云代金券