博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)...
阅读量:5877 次
发布时间:2019-06-19

本文共 8280 字,大约阅读时间需要 27 分钟。

PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包。PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法。同时它也是一个可以在几乎所有主流操作系统(如Unix,windows,Mac OS)上运行的跨平台的工具包。

PyQt4的类库可分为以下模块:

  • QtCore
  • QtGui
  • QtNetwork
  • QtXml
  • QtSvg
  • QtOpenGL
  • QtSql

其中QtCore包含了PyQt非GUI功能模块的核心部分,这个模块用来对时间、文件和目录、不同的数据类型、流、URL、资源的媒体类型、线程和进程进行处理。 

QtGui包含了图形相关的组件和类库,包括按钮(button)、窗口(window)、状态栏(status bar)、工具栏(toolbar)、滑块(slider)、位图(bitmap)、颜色(color)和字体(font)等等【这些名词的英文我们在编程中会经常用到】。 
QtNetwork包含了网络编程相关模块。这些类库有助于TCP/IP编程和客户端&服务器端的UDP编程,使得网络编程更加简单和轻便。 
QtXml包含处理Xml文件的类库。这个模块提供了对SAM和DOM接口的实现。 
QtSvg提供了显示svg文件的类库。SVG,全称Scalable Vector Graphics,即可缩放矢量图形,是一种基于xml的描述二维图形和图像应用的文件格式。 
QtOpenGL是用OpenGL库来渲染2D、3D图像的模块。它可以使Qt GUI库和OpenGL库无缝接合【好厉害的样子】。 
最后,QtSql模块提供了处理数据库的类库。

 

PyQt4 和 PyQt5 的不同之处

The PyQt5 is not backward compatible with PyQt4; there are several significant changes in PyQt5. However, it is not very difficult to adjust older code to the new library. The differences are, among others, the following:

PyQt5不向后兼容PyQt4;这是一些在PyQt5中的重要改变。然而,将旧代码迁移到新的版本中并不是非常困难。不同点如下:

  • Python 模块已经被改写. 一些模块被舍弃 (QtScript), 部分的模块被分割成子模块 (QtGuiQtWebKit).
  • 新的模块被引进, 包含 QtBluetoothQtPositioning, 和 Enginio.
  • PyQt5 只支持最新风格的信号和槽的写法. SIGNAL()和SLOT()的调用将不会被长时间支持.
  • PyQt5 不支持任何在Qt 5.0版本中弃用或取消的API

其它GUI框架

写GUI程序的Python程序员可以在这三种框架中选择:PyQt,PyGTK和wxPython。

 

例子:生成一个空白窗口

 下面是PyQt4的程序(windows版本):

1 import sys 2 from PyQt4 import QtGui 3  4 def main(): 5     app=QtGui.QApplication(sys.argv) 6     w=QtGui.QWidget() 7     w.resize(250,150) 8     w.move(300,300) 9     w.setWindowTitle('Simple')10     w.show()11     sys.exit(app.exec_())12 13 if __name__=='__main__':14     main()

 结果:

w = QtGui.QWidget()

QtGui.QWidget是PyQt4所有用户接口对象中的基础类库。我们在这里调用了QtGui.QWidget的默认构造函数,这个构造没有父对象。我们把没有父对象的部件(widget)叫做窗口(window)

 

下面是PyQt5的相同例子(macOS版本):

1 import sys 2 from PyQt5.QtWidgets import QApplication, QWidget 3  4 def main(): 5     app=QApplication(sys.argv) 6     w=QWidget() 7     w.resize(250,150) 8     w.move(300,300) 9     w.setWindowTitle('Simple')10     w.show()11     sys.exit(app.exec_())12 13 if __name__=='__main__':14     main()

结果:

 

例子:按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox

下面是PyQt4的程序(windows版本)

import sysfrom PyQt4 import QtGui,QtCoreclass winForm(QtGui.QWidget):    def __init__(self):        super(winForm,self).__init__()        self.initUI()    def initUI(self):        QtGui.QToolTip.setFont(QtGui.QFont('SansSerif',10))        self.setToolTip('this is a QWidget widget')        btn=QtGui.QPushButton('Button',self)        btn.setToolTip('this is a QPushButton widget')        btn.resize(btn.sizeHint())        btn.move(50,50)                btn1=QtGui.QPushButton('Quit',self)        btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)        btn1.resize(btn1.sizeHint())        btn1.move(150,50)                self.setGeometry(300,300,250,150)        self.setWindowTitle('Tooltips')      self.setWindowIcon(QtGui.QIcon())        self.center()        self.show()    def closeEvent(self,event):        res=QtGui.QMessageBox.question(self,'info',                "你要确定退出吗?",QtGui.QMessageBox.Yes |                                       QtGui.QMessageBox.No,                                       QtGui.QMessageBox.No)        if res==QtGui.QMessageBox.Yes:            event.accept()        else:            event.ignore()    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=winForm()    sys.exit(app.exec_())if __name__=='__main__':    main()

 

下面是程序的运行效果,依次演示了控件提示,messagebox弹窗

      

 

下面解说上面的代码:

class winForm(QtGui.QWidget):    def __init__(self):        super(winForm,self).__init__()

这里我们创建了一个新的类叫做winForm,括号中的QtGui.QWidget表明这个Example类是从QtGui.QWidget类继承来的。这意味着我们为新类写构造函数时需要调用父类的构造函数。super(Example, self)返回了Example的父对象(即QtGui.QWidget),接着我们调用了父对象的构造函数。注意__init__是Python中的构造函数。

注意:你必须调用父类的构造函数,否则会出现运行错误:

RuntimeError: super-class __init__() of type winForm was never called

 

QtGui.QToolTip.setFont(QtGui.QFont('SansSerif',10))        self.setToolTip('this is a QWidget widget')        btn=QtGui.QPushButton('Button',self)        btn.setToolTip('this is a QPushButton widget')

我们调用setTooltip()这个方法,我们还可以使用html标签!真是想不到。笔者突然想有空可以试试加入div标签,走马灯标签和超链接标签试试。

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

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

btn1=QtGui.QPushButton('Quit',self)        btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)        btn1.resize(btn1.sizeHint())        btn1.move(150,50)

这段代码就是那个名为Quit的按钮,它是一个push button,点击它程序就退出。

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

QPushButton(string text, QWidget parent = None)

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

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

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

self.setGeometry(300,300,250,150)        self.setWindowTitle('Tooltips')        self.setWindowIcon(QtGui.QIcon())        self.center()        self.show()

这段代码设置窗体的显示位置、大小、标题、程序图标,最后把窗体显示出来。还有一个自定义的函数center,用于窗体居中显示。(你可以注释self.center()来看看有什么不同)

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

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

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

def center(self):        qr=self.frameGeometry()        cp=QtGui.QDesktopWidget().availableGeometry().center()        qr.moveCenter(cp)        self.move(qr.topLeft())

自定义的函数center,用于窗体居中显示

其中QtGui.QDesktopWidget这个类提供了用户桌面的信息,包括屏幕大小。

frameGeometry方法得到了主窗口的矩形框架qr

QtGui.QDesktopWidget().availableGeometry().center() 这些方法来得到屏幕分辨率,并最终得到屏幕中间点的坐标cp

qr.moveCenter(cp) 将矩形框架移至屏幕正中央,大小不变

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

 

def closeEvent(self,event):        res=QtGui.QMessageBox.question(self,'info',                "你要确定退出吗?",QtGui.QMessageBox.Yes |                                       QtGui.QMessageBox.No,                                       QtGui.QMessageBox.No)        if res==QtGui.QMessageBox.Yes:            event.accept()        else:            event.ignore()

这段代码出弹窗,用户可以确认或者取消操作。

根据类定义,如果关闭QtGui.QWidget,QtGui.QCloseEvent将会执行。所以为了达到我们的目的,我们需要重新定制closeEvent()这个事件句柄(event handler)。看来类似于C#中的重写虚函数。

 

 下面是PyQt5的相同功能的代码(macOS版本):

1 import sys 2 from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton, QMessageBox, QDesktopWidget 3 from PyQt5 import QtCore 4 from PyQt5.QtGui import QFont, QIcon 5  6 class winForm(QWidget): 7     def __init__(self): 8         super(winForm, self).__init__() 9         self.initUI()10 11     def initUI(self):12         QToolTip.setFont(QFont('SansSerif', 10))13         self.setToolTip('this is a QWidget widget')14         btn = QPushButton('Button', self)15         btn.setToolTip('this is a QPushButton widget')16         btn.resize(btn.sizeHint())17         btn.move(50, 50)18 19         btn1 = QPushButton('Quit', self)20         btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)21         btn1.resize(btn1.sizeHint())22         btn1.move(150, 50)23 24         self.setGeometry(300, 300, 250, 150)25         self.setWindowTitle('Tooltips')26 27         self.setWindowIcon(QIcon())28         self.center()29         self.show()30 31     def closeEvent(self, event):32         res = QMessageBox.question(self, 'info', '你要确定退出吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)33         if res == QMessageBox.Yes:34             event.accept()35         else:36             event.ignore()37 38     def center(self):39         qr = self.frameGeometry()40         cp = QDesktopWidget().availableGeometry().center()41         qr.moveCenter(cp)42         self.move(qr.topLeft())43 44 45 def main():46     app = QApplication(sys.argv)47     ex=winForm()48     sys.exit(app.exec_())49 50 51 if __name__ == '__main__':52     main()

 

结果:

 

转载地址:http://eozix.baihongyu.com/

你可能感兴趣的文章
LeetCode – LRU Cache (Java)
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
nginx+php的使用
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
【转】唯快不破:创业公司如何高效的进行产品研发管理
查看>>
Spark RDD、DataFrame原理及操作详解
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
007-Shell test 命令,[],[[]]
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>
pandas 按照某一列进行排序
查看>>
在WPF中如何使用RelativeSource绑定
查看>>