您的位置:首页 > 编程语言 > Qt开发

PyQt4入门教程(2)_PyQt4的第一个程序

2016-02-16 20:54 741 查看
注:文中译者的话将用方括号【】标出。


这一部分我们将学习PyQt中一些基本的函数。

一个简单的例子

这是一个能够显示出一个窗口的简单例子。目前为止我们已经可以对这个窗口干很多事情了,比如说改变它的尺寸,最大化,最小化……干这些事情本来需要写很多代码,但是PyQt已经帮我们写好啦【开心】,由于干这些事情的代码在绝大多数应用中都会重复使用,所以没有必要一遍一遍地写这些代码。

我们可以感受到PyQt4是一个很高级的工具库,如果我们用一些比较低级的工具库的话,完成下面这些代码干的事情可能需要敲几百行代码!

# -*- coding: utf-8 -*-

"""
In this example, we create a simple
window in PyQt4.
"""

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


这里我们导入了一些必要的组件,其中基本的GUI部件是包含在QtGui模块中的。

app = QtGui.QApplication(sys.argv)


每一个PyQt4应用都必须创建一个应用(application)对象,这个应用对象位于QtGui模块中。其中的sys.argv参数是由命令行参数组成的列表(list)。Python脚本也可以从shell中运行,这是我们控制脚本启动的一种方式。【这里暂时不理解也没有关系,影响不大,记住要创建application就行】

w = QtGui.QWidget()


QtGui.QWidget是PyQt4所有用户接口对象中的基础类库。我们在这里调用了QtGui.QWidget的默认构造函数,这个构造没有父对象。我们把没有父对象的部件(widget)叫做窗口(window)。【这里对于父对象暂时也不需要理解,理解不到也没关系。这句中我们就是创造了一个没有父对象的部件,也就是创建了一个窗口w。】

w.resize(250, 150)


很好理解,resize()方法可以调整部件的大小,我们把它调整成了250px宽,150px高。

w.move(300, 300)


move()方法将我们的部件移动到了屏幕上坐标为x=300,y=300的地方。【注:屏幕的坐标是以左上角为原点的,横着是x轴,竖着是y轴。】

w.setWindowTitle('Simple')


这里我们设定了部件(其实是个窗口)的标题,标题将在标题栏中显示。

w.show()


show()方法使我们创建的部件能够在屏幕上显示出来。部件先在内存(memory)中被创建,之后再被显示到屏幕上。

sys.exit(app.exec_())


在显示了窗口之后,我们进入了程序的主循环,并且开始处理时间。主循环从窗口接收事件并对部件进行处理。如果我们调用exit()函数或者关闭最主要的部件,主循环将终止。这里的sys.exit()调用保证程序完全退出。

值得一提的是exec_()中有一个下划线,为什么呢?因为exec是一个Python关键字,因此加了下划线。

最后,我们运行程序,就会得到下面这个简单的窗口。



应用的图标

应用图标是那个在应用窗口左上角显示的那个东西。下面这个例子展示了如何在PyQt4中定制应用图标。我们还会介绍一些新的函数。

# -*- coding: utf-8 -*-

"""
This example shows an icon
in the titlebar of the window.
"""

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__()
...


在面向对象的编程中最重要的三个东西是类(classes),数据(data)和方法(methods)。这里我们创建了一个新的类叫做Example,括号中的QtGui.QWidget表明这个Example类是从QtGui.QWidget类继承来的。这意味着我们为新类写构造函数时需要调用被继承类的构造函数。super(Example, self)返回了Example的父对象(即QtGui.QWidget),接着我们调用了父对象的构造函数。注意
__init__
是Python中的构造函数。

self.initUI()


这里我们调用了一个我们自己写的initUI()函数来创建GUI。

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


由于我们是继承 QtGui.QWidget类,我们的新类其实就是一个部件(widget),有widget的所有方法,这三个方法就都出自widget。

我们先来介绍一下setGeometry这个方法,它做了两件事情:将部件定位并设定了它的大小【其实就是resize和move的混合函数】。前两个参数是部件相对于父元素的x,y坐标【这里其实是个窗口(window),没有父元素记得吗?所以是屏幕上的x,y坐标。】,后两个参数是部件的宽和高。

接下来说一下setWindowIcon这个方法,它设定了应用的图标。为了做到这一点,我们创建了一个QtGui.QIon对象,创建时的参数就是我们想要的图标的路径。

def main():

app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

if __name__ == '__main__':
main()


启动代码放在了main函数中,我们先创建一个应用(application),然后创建我们定义的新类Example的一个实例ex。

【注意
if __name__ == '__main__'
这个Python中惯用的定义入口点的方式。】

最后的效果就是这个样子,图标变啦:



显示提示栏

我们可以让鼠标移到部件上时显示提示信息。

# -*- coding: utf-8 -*-

"""
This example shows a tooltip on
a window and a button
"""

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()


在这个例子中,我们使两个部件可以显示提示信息。

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


这个方法设置了一个用来显示提示信息的字体,我们使用大小10px的SansSerif字体。

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


为了创建一个提示框,我们调用setTooltip()这个方法,我们还可以使用html标签【厉害吧】。

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


这里我们创建了一个按钮,并给它加上了提示框(Tooltip)。

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


我们设定了按钮的大小,位置。其中sizeHint()方法返回了一个推荐的大小。

最后运行出来是这个样子的:



关闭窗口

最显然的一种关闭窗口的办法当然是点击窗口右上角的那个叉叉。在下一个例子中,我们将会展示怎样程序性地关闭窗口,比如设置一个有关闭窗口作用的按钮。我们还会简单地接触到信号(与)槽系统(signals and slots)。

我们在例子中要使用的QtGui.QPushButton的构造函数原型是这样的:

QPushButton(string text, QWidget parent = None)


其中text参数是按钮上显示的文字。parent参数是部件的父对象,在这里就是我们要把按钮放在什么上,本例中是一个QtGui.QWidget【其实是一个窗口(window)】。

# -*- coding: utf-8 -*-

"""
This program creates a quit
button. When we press the button,
the application terminates.
"""

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()


在本例中,我们创造了一个有退出作用的quit按钮,只要鼠标点击这个按钮,应用就终止运行了。

from PyQt4 import QtGui, QtCore


这里我们需要QtCore中的一个对象,所以需要额外引入这个模块。

qbtn = QtGui.QPushButton('Quit', self)


这里我们创造了一个按钮(push button),它是QtGui.QPushButton类的一个实例。第一个参数是按钮上的文字,第二个参数是父对象,这里就是我们创建的Example了,也就是self,它继承自QtGui.QWidget类【Example没有父对象,是一个窗口(window),记得吗】。

qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)


PyQt4中的事件处理系统是由信号槽机制(signals and slots)实现的。如果我们点击了这个按钮,就会发出“clicked”这个信号。QtCore.QCoreApplication这个东西包含了程序的主循环,它处理和分派所有的事件,而instance()方法返回的是目前的实例(insatnce)。注意到QtCore.QCoreApplication随着QtGui.QApplication的创建而创建,而由于我们这里用connect()函数将“clicked”事件和可以终止应用的quit()函数联系(connect)在了一起,所以点击按钮,应用终止。这种交流在两个对象之间完成:发送者和接受者,其中发送者是按钮,接受者是应用本身。【这里只要大家对connect方法有个感性的认识就可以了】

运行出来就是这个样子:



消息框(Message Box)

默认情况下,如果我们点击了程序右上角的叉叉,

QtGui.QWidget部件就会被关闭。但有时我们想要改变这种默认的行为,比如说,如果我们在编辑一些东西,关闭窗口时我们想要弹出一个消息框来确认是否退出。

# -*- coding: utf-8 -*-

"""
This program shows a confirmation
message box when we click on the close
button of the application window.
"""

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.QWidget,QtGui.QCloseEvent将会执行。所以为了达到我们的目的,我们需要重新定制closeEvent()这个事件句柄(event handler)如下。

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


这里我们设定显示一个有两个选项(yes & no)的消息框(message box)。QtGui.QMessageBox.question()方法的第二个参数是出现在标题栏的标题,第三个参数是消息框显示的对话内容,第四个参数是出现在消息框的按钮的组合【用或( | )连接】,最后一个参数是默认按钮,即消息框刚跳出来的时候按enter键就可以执行的按钮。这里我们将函数的返回值存储在了reply这个变量中。

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


这里我们测试函数的返回值。如果我们点击了Yes按钮,close这个事件将会被接受(accept),部件关闭、应用结束;否则close这个事件将会被忽视(ignore),程序继续执行。

运行出来是这个样子:



使窗口显示在屏幕中间

下面这个脚本实现了让窗口在屏幕的中央显示。

# -*- coding: utf-8 -*-

"""
This program centers a window
on the screen.
"""

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()


我们调用一个自己写的center()方法来实现窗口在屏幕中央显示。

qr = self.frameGeometry()


这里我们用frameGeometry方法得到了主窗口的矩形框架qr。

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


我们调用这些方法来得到屏幕分辨率,并最终得到屏幕中间点的坐标cp。

qr.moveCenter(cp)


这里我们将矩形框架移至屏幕正中央,大小不变。

self.move(qr.topLeft())


最后我们将应用窗口移至矩形框架的左上角点,这样应用窗口就位于屏幕的中央了【注意部件的move都是左上角移动到某点】。

好了,这就是本节全部的内容了,我们已经掌握了一些基本的方法!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: