PyQt4教程 – 02 第一个PyQt4程序

来源:互联网 发布:体彩排列5历史开奖数据 编辑:程序博客网 时间:2024/05/22 06:04

在这个部分我们将学习一些PyQt4的基本功能,解释比较慢,就像在对孩子说话。The first steps of a child are awkward, so are the very first attempts of a newbie programmer. 请记住,没有蠢人,There are only lazy people and people, that are not persistent enough.

简单的例子

该代码示例非常简单,仅仅显示一个小窗体,但是我们仍然可以用这个窗体做很多事,我们可以调整其大小、最大化、最小化。这些功能需要大量的代码,不过有人已经编写了这些功能。它们在大多数应用中重复使用,没有必要再次编写这些代码,所以它们被隐藏了起来。PyQt是一个高级的工具包。如果我们在低级的工具包上编写代码,下面的代码示例可能很容易的多出数十行。

#!/usr/bin/python# simple.pyimport sysfrom PyQt4 import QtGuiapp = QtGui.QApplication(sys.argv)widget = QtGui.QWidget()widget.resize(250, 150)widget.setWindowTitle('simple')widget.show()sys.exit(app.exec_())
 import sys from PyQt4 import QtGui

在这里我们导入必须的模块。基本的GUI部件位于QtGui模块。

app = QtGui.QApplication(sys.argv)

每个PyQt4应用程序都必须创建一个应用程序对象,应用程序对象是位于QtGui模块。sys.argv参数是命令行参数列表。Python脚本可以从shell运行,这是一种控制脚本启动的方法。

 widget = QtGui.QWidget()

QWidget的部件是PyQt4中所有在用户界面对象的基类。我们使用了QWidget的默认构造函数。默认的构造函数有没有父类。一个没有父类的部件被称为一个窗体。

widget.resize(250, 150)

resize() 方法调整部件的大小,250px宽,150px高。

 widget.setWindowTitle('simple')

设置窗口的标题,标题显示在标题栏中。

widget.show()

show()方法在屏幕上显示部件。

 sys.exit(app.exec_())

最后,我们进入应用程序的主循环。事件处理从这一点开始,主循环接收来自Windows系统的事件,并且分派到应用程序部件上。如果我们调用exit()方法或主要部件被关闭,主循环结束。sys.exit()方法确保干净的退出。环境变量会报告程序是如何结束的。

你想知道为什么exec_()方法有下划线?任何东西都有其意义。这里显然是因为exec是Python的关键字,因此用exec_()代替。


简单
图:simple


应用程序图标

应用程序图标是一个小图像,通常是在顶部标题栏的左上角显示。在下面的例子中,我们将展示如何在PyQt4中显示它。同时我们还将介绍一些新的方法。

#!/usr/bin/python# icon.pyimport sysfrom PyQt4 import QtGuiclass Icon(QtGui.QWidget):    def __init__(self, parent=None):        QtGui.QWidget.__init__(self, parent)        self.setGeometry(300, 300, 250, 150)        self.setWindowTitle('Icon')        self.setWindowIcon(QtGui.QIcon('icons/web.png'))app = QtGui.QApplication(sys.argv)icon = Icon()icon.show()sys.exit(app.exec_())

上一个例子是面向过程的。Python编程语言同时支持的面向过程和面向对象的编程风格。在PyQt4上编程意味着面向对象的编程。

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

面向对象编程中最重要的三样东西是类、数据和方法。我们创建了一个新的类叫做Icon。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坐标,第三个是窗体的宽度,第四个是窗体的高度。最后一个方法设置应用程序图标,要做到这一点,我们创建了一个QIcon对象。QIcon接受需要显示的图标的路径。


图标
图:Icon
 

显示工具提示

我们可以为部件的提供气泡式帮助。

#!/usr/bin/python# tooltip.pyimport sysfrom PyQt4 import QtGuifrom PyQt4 import QtCoreclass Tooltip(QtGui.QWidget):    def __init__(self, parent=None):        QtGui.QWidget.__init__(self, parent)        self.setGeometry(300, 300, 250, 150)        self.setWindowTitle('Tooltip')        self.setToolTip('This is a <b>QWidget</b> widget')        QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))app = QtGui.QApplication(sys.argv)tooltip = Tooltip()tooltip.show()sys.exit(app.exec_())

在这个例子中,我们为QWidget显示提示。

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

要创建一个提示,需要调用setTooltip()方法。我们可以用富文本格式。

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

因为默认QToolTip字体看起来很差,所以修改了。


工具提示
图:Tooltip
 

关闭窗口

关闭窗体最明显的方法就是点击标题栏上的X标志。在下面的例子,我们将展示如何用程序关闭我们的窗体。我们会稍稍接触一下信号(signals)和插槽(slots)。

下面构造了一个将在例子中使用的QPushButton。

   QPushButton(string text, QWidget parent = None)

text参数是在按钮上显示的文本。parent是祖先,也就是放置按钮的地方。在我们的例子中是QWidget。

#!/usr/bin/python# quitbutton.pyimport sysfrom PyQt4 import QtGui, QtCoreclass QuitButton(QtGui.QWidget):    def __init__(self, parent=None):        QtGui.QWidget.__init__(self, parent)        self.setGeometry(300, 300, 250, 150)        self.setWindowTitle('Quit button')        quit = QtGui.QPushButton('Close', self)        quit.setGeometry(10, 10, 60, 35)        self.connect(quit, QtCore.SIGNAL('clicked()'),            QtGui.qApp, QtCore.SLOT('quit()'))app = QtGui.QApplication(sys.argv)qb = QuitButton()qb.show()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中的事件处理系统由信号和插槽机制构成。如果我们按一下按钮,信号clicked()被发送出去。插槽可以是一个PyQt的插槽或任何Python可调用部分。QtCore.QObject.connect()方法将信号连接到插槽。在我们的例子中,插槽是一个预定义的PyQtquit()插槽。这在两个对象(发送者和接收者)间建立了通讯。发送者人是按钮,接收者的应用程序对象。


退出按钮
图:quit button
 

消息框

默认情况下,如果我们点击标题栏上的X按钮,QWidget被关闭。有时我们要修改这个默认的行为。举例来说,如果我们在编辑器中打开了一个文件,并做了一些修改,我们就需要显示一个消息框,以确认该操作。

#!/usr/bin/python# messagebox.pyimport sysfrom PyQt4 import QtGuiclass MessageBox(QtGui.QWidget):    def __init__(self, parent=None):        QtGui.QWidget.__init__(self, parent)        self.setGeometry(300, 300, 250, 150)        self.setWindowTitle('message box')    def closeEvent(self, event):        reply = QtGui.QMessageBox.question(self, 'Message',            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)        if reply == QtGui.QMessageBox.Yes:            event.accept()        else:            event.ignore()app = QtGui.QApplication(sys.argv)qb = MessageBox()qb.show()sys.exit(app.exec_())

如果我们关闭QWidget,将会产生QCloseEvent事件。要修改构件的行为,我们需要重新实现closeEvent()事件处理程序。

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

我们显示一个带有两个按钮的消息框,Yes和No。第一个字符串显示在标题栏中。第二个字符串是对话框显示的消息文本。返回值存储在reply变量中。

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

在这里,我们检查返回值。如果按得是Yes按钮,我们接受了事件,关闭的部件,终止应用程序。否则,忽略close事件。


消息框
图:message box
 

在屏幕上的对中窗体

下面的脚本演示如何能够在桌面的中心建立一个窗体。

#!/usr/bin/python# center.pyimport sysfrom PyQt4 import QtGuiclass Center(QtGui.QWidget):    def __init__(self, parent=None):        QtGui.QWidget.__init__(self, parent)        self.setWindowTitle('center')        self.resize(250, 150)        self.center()    def center(self):        screen = QtGui.QDesktopWidget().screenGeometry()        size =  self.geometry()        self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)app = QtGui.QApplication(sys.argv)qb = Center()qb.show()sys.exit(app.exec_())
 self.resize(250, 150)

这是调整QWidget到250px宽,150px高。

 screen = QtGui.QDesktopWidget().screenGeometry()

计算出我们的显示器的屏幕分辨率。

 size =  self.geometry()

获得到QWidget的大小。

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

将窗口移动到屏幕的中心。

原创粉丝点击