PyQt4入门学习笔记(一)

一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习。

原始链接如下:

http://zetcode.com/gui/pyqt4/firstprograms/

在这篇PyQt4的入门文档,我们讲学习一些基础功能。

简单的例子

这是一个显示一个小窗口的简单例子。我们可以对这个窗口做一些操作。我们可以改变它的大小,最大化它,或者最小化它。这需要大量的编码。有人已经写好了这些基础函数,因为它在绝大部分应用中重复出现,不需要重复的去编码。PyQt4是一个高级的工具包。如果我们在一个低级的工具包里编码,下面这个例子可能轻松过百行。

#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial In this example, we create a simple
window in PyQt4. author: Jan Bodnar
website: zetcode.com
last edited: October 2011
""" import sys
from PyQt4 import QtGui def main(): app = QtGui.QApplication(sys.argv) w = QtGui.QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Simple')
w.show() sys.exit(app.exec_()) if __name__ == '__main__':
main()

上面这段代码运行后将在屏幕上显示一个小窗口。

import sys
from PyQt4 import QtGui

我们在这里提供必要的import,基础的GUI窗口部件在QtGui模块里。

app = QtGui.QApplication(sys.argv)

每一个PyQt4的应用必须创建一个Application对象。参数sys.argv是一个来自命令行的参数列表。python脚本可以从shell脚本里运行。这是一种我们可以控制我们脚本启动的方式。

w = QtGui.QWidget()

QtGui.Qwidgt部件是一个是pyqt4里所有用户接口对象中的基类。我们用默认的QtGui.Qwidgt构造器(constructor)。默认的构造器没有父类,一个不带父类的窗口部件在窗口被调用。

w.resize(250, 150)

这个resize()方法改变窗口大小。上述语句把窗口改成了250px宽,150px高。

w.move(300, 300)

这个move()方法移动窗口到屏幕上坐标为x,y=(300,300)的位置

w.setWindowTitle('Simple')

上述语句使我们为我们的窗口设置标题,标题会被显示在标题栏(titlebar)

w.show()

这个show()方法把窗口部件显示在屏幕上。一个窗口是先在内存中创建,然后再在屏幕上显示。

sys.exit(app.exec_())

最终,我们结束了应用的主循环。主循环是从窗口系统中接收事件并快速的发往应用窗口。当我们调用exit()方法或者关闭主窗口时,主循环结束。这个sys.exit()方法是确保一个干净的关闭。

这个exec_()方法有个下划线,因为exec是python的一个关键字,所以用exec_替代了。

如果你按照上面的代码运行,那么应该会得到类似下面这样的状态(我自己修改了窗口的大小,因为surfacebook的高分辨率几乎让我看不到原来的标题,但样式大致不会变)

应用图标

应用图标(application icon)是一个被用来显示在标题栏顶部左侧角落的小图片。在下面这个例子中,我们将展示如何在pyqt4里面实现它。我们同时也会介绍一些新方法。

#!/usr/bin/python

# -- coding: utf-8 --

"""
ZetCode PyQt4 tutorial This example shows an icon
in the titlebar of the window. author: Jan Bodnar
website: zetcode.com
last edited: October 2011
""" import sys
from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self):
super(Example, self).__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
self.setWindowIcon(QtGui.QIcon('web.png')) self.show() def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_()) if __name__ == '__main__':
main()

我们前一个例子是用面向过程的风格编程。python是一门既支持面向过程又支持面向对象的语言。在pyqt4内编程,意味着OOP(面向对象)。

class Example(QtGui.QWidget):

    def __init__(self):
super(Example, self).__init__()
...

面向对象中三个最重要的事是类(class),数据(data),和方法(method)。在这里我们创建了一个叫做Example的新类。这个Example类是继承于QtGui.QWidget,这意味着我们可以调用两个构造器,第一个是对Example类,另一个是对被继承的类。

super()方法返回Example类的父类对象。__init__()方法是python的一个构造器方法。

self.initUI()

GUI的创建是被委托给initUI()方法。

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

这三个方法都是从QtGui.QWidget类继承过来。

setGeometry()方法做两个事。它定位了窗口在屏幕的位置并且设定窗口大小。前两个参数是窗口的x,y坐标。第三个参数是窗口宽度,第四个是窗口高度。事实上,它结合了resize()move()方法。最后一个方法设定了应用的图标。为了做到这个,我们创建了一个QtGui.QIcon类型的对象。QtGui.QIcon接受一个图片的路径(就是你想用来做图标的图片)

def main():

    app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_()) if __name__ == '__main__':
main()

启动代码被放在一个main()方法内(我想这叫函数更好?)。这是一个python 的习惯用法。

运行后类似下图

展示一个提示工具

我们可以给我们的任何一个部件提供一个气泡提示。

#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial This example shows a tooltip on
a window and a button author: Jan Bodnar
website: zetcode.com
last edited: October 2011
""" import sys
from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self):
super(Example, self).__init__() self.initUI() def initUI(self): QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') btn = QtGui.QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50, 50) self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Tooltips')
self.show() def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_()) if __name__ == '__main__':
main()

在这个例子里,我们为两个pyqt4部件显示了一个提示工具。

QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))

这个基础的方法设定一个被用来渲染提示工具的字体。我们用了一个10px的SansSerif字体。

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

为了创建一个提示工具,我们调用setTooltip()方法。我们同时可以使用富文本。

btn = QtGui.QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

我们创建了一个按钮(button),并且为其设定一个提示工具。

btn.resize(btn.sizeHint())
btn.move(50, 50)

这个按钮在窗口上被改变大小并且被移动。这个sizeHint()方法提供了一个按钮的推荐尺寸。

运行上面的程序后,效果类似下图

关闭窗口##

我们之前关闭窗口的方法是点击标题栏的"x"。在下一个例子里,我们将会展示我们可以程序化的关闭我们的窗口。我们将会稍稍的接触一下信号(signal)和槽(slot)。

下面是一个我们将会用在我们例子中的QtGui.QPushButton的构造器。

QPushButton(string text, QWidget parent = None)

text参数是一个被用来展示在按钮上的字符串。parent是一个我们按钮的父类部件,在我们的例子里,它将会是QtGui.QWidget

#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial This program creates a quit
button. When we press the button,
the application terminates. author: Jan Bodnar
website: zetcode.com
last edited: October 2011
""" import sys
from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self):
super(Example, self).__init__() self.initUI() def initUI(self): qbtn = QtGui.QPushButton('Quit', self)
qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
qbtn.resize(qbtn.sizeHint())
qbtn.move(50, 50) self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Quit button')
self.show() def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_()) if __name__ == '__main__':
main()

在这个例子里,我们创建了一个离开按钮。点击按钮,应用将会被终止

运行后效果类似下图

消息盒子##

默认的,如果我们点击了标题栏的"X",QtGui.QWidget将会被关闭。有些时候我们想要修改这个默认的行为。举个例子,如果我们有一个文件在一个编辑器内被打开,并且做了些修改,退出时我们会显示一个消息盒子让人确定这个动作。

#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial This program shows a confirmation
message box when we click on the close
button of the application window. author: Jan Bodnar
website: zetcode.com
last edited: October 2011
""" import sys
from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self):
super(Example, self).__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Message box')
self.show() def closeEvent(self, event): reply = QtGui.QMessageBox.question(self, 'Message',
"Are you sure to quit?", QtGui.QMessageBox.Yes |
QtGui.QMessageBox.No, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore() def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_()) if __name__ == '__main__':
main()

如果我们关闭QtGui.QWidgetQtGui.QCloseEvent将会被触发。为了修改部件行为我们需要重新实现closeEvent事件handler。

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

我们展示了一个带有两个按钮的消息盒子:yes和no,第二个字符串是对话框显示的字符串。第三个参数具体规定了按钮和显示文字的组合。最后一个参数是默认的按钮。它是一个初始化的键盘focus的按钮。(就是直接enter时选择的按钮)。返回值被存储在reply变量中。

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

我们测试了返回值。如果点击了yes按钮,我们接受一个关闭部件的时间并且关闭应用。其他情况我们关闭这个事件。

运行后类似下图:

将窗口置于屏幕中间##

下面的脚本显示我们如何在桌面屏幕上中心化一个窗口

#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial This program centers a window
on the screen. author: Jan Bodnar
website: zetcode.com
last edited: October 2011
""" import sys
from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self):
super(Example, self).__init__() self.initUI() def initUI(self): self.resize(250, 150)
self.center() self.setWindowTitle('Center')
self.show() def center(self): qr = self.frameGeometry()
cp = QtGui.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft()) def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_()) if __name__ == '__main__':
main()

QtGui.QDesktopWidget类提供了关于用户桌面的信息,包括屏幕尺寸

self.center()

这行代码将会将窗口置于屏幕中心

qr = self.frameGeometry()

我们在主窗口内得到一个指定的长方形几何体。

cp = QtGui.QDesktopWidget().availableGeometry().center()

我们得到了显示器的中心点。

qr.moveCenter(cp)

我们的长方形窗口已经有了宽度和高度,现在我们设定它的中心在屏幕中心。它的大小不变。

self.move(qr.topLeft())

我们移动应用窗口的左上点到长方形的左上角,至此我们就将窗口移动到了中央。

在这一节pyqt4的教程中,我们讨论了一些基本的内容。

翻译和补充的有误的地方,欢迎在评论区指正。

PyQt4入门学习笔记(一)的更多相关文章

  1. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  2. PyQt4入门学习笔记(二)

    之前第一篇介绍了pyqt4的大小,移动位置,消息提示.这次我们介绍菜单和工具栏 QtGui.QmainWindow这个类可以给我们提供一个创建带有状态栏.工具栏和菜单栏的标准的应用. 状态栏 状态栏是 ...

  3. PyQt4入门学习笔记(五)

    PyQt4里的对话框 对话框是大多数GUI应用中不可分割的一部分.一个对话框是两者或多者的会话.在GUI内,对话框是应用向人说话的方式.一个对话框可以用来输入数据,修改数据,改变应用设置等等. QtG ...

  4. PyQt4入门学习笔记(四)

    在PyQt4中的事件和信号 事件 所有的GUI应用都是事件驱动的.事件主要是来自于应用的使用者,但是像互联网连接,窗口管理器或者计时器也可以产生事件.当我们调用应用的exec_()方法时,应用就进入了 ...

  5. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  6. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  7. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  8. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  9. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

随机推荐

  1. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  2. .net 分布式架构之配置中心

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ConfigManager ...

  3. SignalR SelfHost实时消息,集成到web中,实现服务器消息推送

    先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...

  4. 卸载oracle之后,如何清除注册表

    之前卸载了oracle,今天偶然间发现,在服务和应用程序里面,还残存着之前的oracle服务.原来,还需要去清理下注册表. 在开始菜单的这个框里面 输入regedit,进入注册表.找到这个目录 HKE ...

  5. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  6. js 基础篇(点击事件轮播图的实现)

    轮播图在以后的应用中还是比较常见的,不需要多少行代码就能实现.但是在只掌握了js基础知识的情况下,怎么来用较少的而且逻辑又简单的方法来实现呢?下面来分析下几种不同的做法: 1.利用位移的方法来实现 首 ...

  7. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

  8. React Native Android gradle下载慢问题解决

    很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...

  9. 软件工程(C编码实践篇)学习心得

    孟繁琛 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程 http://mooc.study.163.com/course/USTC-1000002006 软件工程 ...

  10. nexus 社区版3.0.2部署、访问

    下载nexus社区办(oss): https://www.sonatype.com/download-oss-sonatype 目前最新版本  nexus-3.0.2-02-win64.zip nex ...