PyQt4 - 关闭最小化问题

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

 1

#!/usr/bin/python  2  3

# simple.py  4  5

import sys  6

from PyQt4 import QtGui  7  8

app = QtGui.QApplication(sys.argv)  9 10

widget = QtGui.QWidget() 11

widget.resize(250, 150) 12

widget.setWindowTitle('simple') 13

widget.show() 14

15

sys.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)

    将窗口移动到屏幕中央。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏liuchengxu

怎么写一个好的 Git commit message

网络上很多关于 commit message 的想法都来源于 tpope,在他看来,一个好的 Git commit messge 应该是这样的:

782
来自专栏黑泽君的专栏

day27_Struts2学习笔记_04

   需要熟悉 ActionContext类 和 ValueStack接口 的 API 。框架为我们存数据。 1.1、利用 ActionContext 存数据...

772
来自专栏技术栈大杂烩

Pycharm: 代码跳转如何回退 (小技巧)

玩Python已经有段时间了, 一般都是通过vim和Pycharm来开发, 真心觉得这两个是神器. Vim神器暂且不说, 今天来分享Pycharm的一个小技巧.

2312
来自专栏黒之染开发日记

【easeljs】事件汇总

文章说明:为了方便我自己查找easeljs的所有事件,所以我从easeljs的文档里抄过来加上自己的翻译,会慢慢补全,漏了的,错了的,评论一下我会补上去哦。(不...

1212
来自专栏landv

实现用VB.Net/(C#)开发K/3 BOS 插件的真正可行方法

1241
来自专栏逆向技术

PE格式第四讲,数据目录表之导入表,以及IAT表

           PE格式第四讲,数据目录表之导入表,以及IAT表 一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的...

2165
来自专栏逍遥剑客的游戏开发

C++与Flash的交互

3548
来自专栏Windows Community

New UWP Community Toolkit - Markdown

概述 前面 New UWP Community Toolkit 文章中,我们对 V2.2.0 版本的重要更新做了简单回顾,其中简单介绍了 MarkdownTex...

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

Flash/Flex学习笔记(1):Hello World!

万世开头难,先来一个Hello World!吧,Adobe出了二款支持Action Script3语言的经典开发工具,即:Flash CS 与Flash Bui...

2075
来自专栏LIN_ZONE

vue中使用html2canvas及解决html2canvas截屏图片模糊问题

html2canvas  官方网站http://html2canvas.hertzen.com/index.html

3.3K1

扫码关注云+社区

领取腾讯云代金券