PyQt5初级教程--PyQt5的第一个程序[3/13]

想用PyQt5写GUI,但是网上的PyQt5资源太少了,找到一个英文的,翻译一下,和学习PyQt5的同学共勉!

(本系列中所有代码在windows7 64位[]/Python 3.4.3 32bit/PyQt GPL v5.5 for Python v3.4 (x32)/eric6-6.0.8下测试通过.)

原本地址:http://zetcode.com/gui/pyqt5/

================================================================================

第一个PyQt5程序

在这部分,我们学习一些基本功能.

简单的例子

这是一个简单的例子,它显示一个小窗口.我们可以对这个窗口做很多事情,我们可以调整它的大小,最大化它或最小化它.这需要很多代码.但是已经有人编写了这个功能.因为它在绝大多数的应用中重复出现,因此没有必要重复的编写它.PyQt5是高级工具集.如果我们把它当作一个低级工具集,那么下面的代码例子可能要有几百行.

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

以上代码会在屏幕上显示一个小窗口.

[plain] view plain copy
  1. import sys  
  2. from PyQt5.QtWidgets import QApplication, QWidget  
这们在这里进行必要的导入.基本的窗口集在PyQt5.QtWidgets模块里.


[plain] view plain copy
  1. app = QApplication(sys.argv)  
每一个PyQt5应用都必须创建一个应用对象.sys.argv参数是来自命令行的参数列表.Python脚本可以从shell里运行.这是我们如何控制我们的脚本运行的一种方法.


[plain] view plain copy
  1. w = QWidget()  
QWidget窗口是PyQt5中所有用户界口对象的基本类.我们使用了QWidget默认的构造器.默认的构造器没有父类.一个没有父类的窗口被称为一个window.

[plain] view plain copy
  1. w.resize(250, 150)  
resize()方法调整了窗口的大小.被调整为250像素宽和150像素高.

[plain] view plain copy
  1. w.move(300, 300)  
move()方法移动了窗口到屏幕坐标x=300, y=300的位置.

[plain] view plain copy
  1. w.setWindowTitle('Simple')  
在这里我们设置了窗口的标题.标题会被显示在标题栏上.

[plain] view plain copy
  1. w.show()  
show()方法将窗口显示在屏幕上.一个窗口是先在内存中被创建,然后显示在屏幕上的.

[plain] view plain copy
  1. sys.exit(app.exec_())  
最后,我们进入应用的主循环.事件处理从这里开始.主循环从窗口系统接收事件,分派它们到应用窗口.如果我们调用了exit()方法或者主窗口被销毁,则主循环结束.sys.exit()方法确保一个完整的退出.环境变量会被通知应用是如何结束的.

exec_()方法是有一个下划线的.这是因为exec在Python中是关键字.因此,用exec_()代替.


PyQt5初级教程--PyQt5的第一个程序[3/13]

图片:简单的例子


一个应用图标

一个应用图标是一个用于显示在标题栏最左上角的小图像.在下面的例子中我们会在PyQt5中演示,同时我们还会介绍一个新的方法.

[plain] view plain copy
  1. import sys  
  2. from PyQt5.QtWidgets import QApplication, QWidget  
  3. from PyQt5.QtGui import QIcon  
  4.   
  5.   
  6. class Example(QWidget):  
  7.       
  8.     def __init__(self):  
  9.         super().__init__()  
  10.           
  11.         self.initUI()  
  12.           
  13.           
  14.     def initUI(self):  
  15.           
  16.         self.setGeometry(300, 300, 300, 220)  
  17.         self.setWindowTitle('Icon')  
  18.         self.setWindowIcon(QIcon('web.png'))          
  19.       
  20.         self.show()  
  21.           
  22.           
  23. if __name__ == '__main__':  
  24.       
  25.     app = QApplication(sys.argv)  
  26.     ex = Example()  
  27.     sys.exit(app.exec_())    
上一个例子是用传统的过程化风格来编写的.Python编程语言即支持过程化的也支持面向对象的编程风格.在PyQt5里的编程意味着是OOP的.

[plain] view plain copy
  1. class Example(QWidget):  
  2.       
  3.     def __init__(self):  
  4.         super().__init__()  
  5.         ...  
在面向对象编程中重要的是类、数据和方法.在这里,我们创建了一个叫Example的新类.Example类是从QWidget类继承下来的.这意味着我们可以调用两个构造器:对于Example类的第一个和继承类的第二个.super()方法返回的是Example类的父对象,我们调用了它的构造器.__init__()方法是Python语言中的一个构造方法.

[plain] view plain copy
  1. self.initUI()  
GUI的创建是委托给initUI()方法的.


[plain] view plain copy
  1. self.setGeometry(300, 300, 300, 220)  
  2. self.setWindowTitle('Icon')  
  3. self.setWindowIcon(QIcon('web.png'))       
这三个方法都是继承于QWidget类.setGeometry()方法做两件事:定位窗口在屏幕上的位置和设置它的大小.前面两个参数是窗口的x和y轴位置.第三个参数是窗口的宽,第四个参数是窗口的高.实际上,它是把resize()和move()这两个方法合并成了一个方法.后面的方法是设置应用程序的图标.首先我们要创建一个QIcon对象,QIcon接收我们图标的路径并显示它(译者注:这里的路径是相对路径--相对于你的源代码所在位置;或者绝对路径).


[plain] view plain copy
  1. if __name__ == '__main__':  
  2.       
  3.     app = QApplication(sys.argv)  
  4.     ex = Example()  
  5.     sys.exit(app.exec_())    

应用程序和例子对象被创建.主循环开始.

PyQt5初级教程--PyQt5的第一个程序[3/13]
图片:图标


显示一个提示信息

我们可以为我们的任何一个窗体提供悬浮帮助信息.

[plain] view plain copy
  1. import sys  
  2. from PyQt5.QtWidgets import (QWidget, QToolTip,   
  3.     QPushButton, QApplication)  
  4. from PyQt5.QtGui import QFont      
  5.   
  6.   
  7. class Example(QWidget):  
  8.       
  9.     def __init__(self):  
  10.         super().__init__()  
  11.           
  12.         self.initUI()  
  13.           
  14.           
  15.     def initUI(self):  
  16.           
  17.         QToolTip.setFont(QFont('SansSerif', 10))  
  18.           
  19.         self.setToolTip('This is a <b>QWidget</b> widget')  
  20.           
  21.         btn = QPushButton('Button', self)  
  22.         btn.setToolTip('This is a <b>QPushButton</b> widget')  
  23.         btn.resize(btn.sizeHint())  
  24.         btn.move(50, 50)         
  25.           
  26.         self.setGeometry(300, 300, 300, 200)  
  27.         self.setWindowTitle('Tooltips')      
  28.         self.show()  
  29.           
  30.           
  31. if __name__ == '__main__':  
  32.       
  33.     app = QApplication(sys.argv)  
  34.     ex = Example()  
  35.     sys.exit(app.exec_())  
在这个例子里,我们为两个PyQt5窗体显示了提示信息.

[plain] view plain copy
  1. QToolTip.setFont(QFont('SansSerif', 10))  
这个静态方法设置了一种字体用于绘制提示信息.我们使用了10像素的SansSerif字体.

[plain] view plain copy
  1. self.setToolTip('This is a <b>QWidget</b> widget')  
要创建一个提示信息,我们要调用setTooltip()方法.我们可以直接用多格式文件来格式化它.

[plain] view plain copy
  1. btn = QPushButton('Button', self)  
  2. btn.setToolTip('This is a <b>QPushButton</b> widget')  
我们创建一个点击按钮并给它设置一个提示信息.

[plain] view plain copy
  1. btn.resize(btn.sizeHint())  
  2. btn.move(50, 50)    
这是用于把按钮定义大小和在窗体位置的.sizeHint()方法会给按钮一个推荐的大小.

PyQt5初级教程--PyQt5的第一个程序[3/13]
图片:提示信息

关闭一个窗口

最明显的关闭一个窗口是点击标题栏上的x.在下个例子中,我们会显示如何以编程的方式去关闭我们的窗口.我们会接触一点信号和槽.

下面是一个QPushButton部件构造器,我们会用在例子中.

[plain] view plain copy
  1. QPushButton(string text, QWidget parent = None)  

text参数是显示在按钮上的文本.parent是我们将按钮放置在哪里的部件.在我们这个例子,parent就是一个QWidget.一个应用程序的部件们会组成一个层次.在这个层次中,大多数的部件有着他们的父类.没有父类的部件就是最顶层的窗口.

[plain] view plain copy
  1. import sys  
  2. from PyQt5.QtWidgets import QWidget, QPushButton, QApplication  
  3. from PyQt5.QtCore import QCoreApplication  
  4.   
  5.   
  6. class Example(QWidget):  
  7.       
  8.     def __init__(self):  
  9.         super().__init__()  
  10.           
  11.         self.initUI()  
  12.           
  13.           
  14.     def initUI(self):                 
  15.           
  16.         qbtn = QPushButton('Quit', self)  
  17.         qbtn.clicked.connect(QCoreApplication.instance().quit)  
  18.         qbtn.resize(qbtn.sizeHint())  
  19.         qbtn.move(50, 50)         
  20.           
  21.         self.setGeometry(300, 300, 250, 150)  
  22.         self.setWindowTitle('Quit button')      
  23.         self.show()  
  24.           
  25.           
  26. if __name__ == '__main__':  
  27.       
  28.     app = QApplication(sys.argv)  
  29.     ex = Example()  
  30.     sys.exit(app.exec_())  

在这个例子中,我们创建一个退出按钮.单击这个按钮时,应用程序就会终止.

[plain] view plain copy
  1. from PyQt5.QtCore import QCoreApplication  
我们需要来自QtCore模块的对象.

[plain] view plain copy
  1. qbtn = QPushButton('Quit', self)  
我们创建一个按钮.按钮是QPushButton类的一个实例.构造器的第一个参数是按钮的标签,第二个参数是父部件类.父部件是Example部件,是从QWidget继承来的.

[plain] view plain copy
  1. qbtn.clicked.connect(QCoreApplication.instance().quit)  
在PyQt5中的事件处理系统是用信号和槽机制构建起来的.如果我们点击按钮,点击信号就会发出.槽可以是一个Qt槽或任何Python可调用的.QCoreApplication包含了主要的事件循环;它处理并分派所有事件.instance()方法给我们它当前的实例.注意QCoreApplication是用QApplication创建的.点击信息被连接到quit()方法,它会终止程序.通信是在发送者和接收者这两个对象之间完成的.这里的发送者是点击按钮,接收者是程序对象.

PyQt5初级教程--PyQt5的第一个程序[3/13]

图片:退出按钮

消息框

在默认情况下,如果我们点击标题栏的x,QWidget会被关闭.有时我们想修改一个默认情况.例如,如果我们在编辑器里有一个被打开的文件,我们做了一些修改.我们会想显示一个消息框来确认操作.

[plain] view plain copy
  1. import sys  
  2. from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication  
  3.   
  4.   
  5. class Example(QWidget):  
  6.       
  7.     def __init__(self):  
  8.         super().__init__()  
  9.           
  10.         self.initUI()  
  11.           
  12.           
  13.     def initUI(self):                 
  14.           
  15.         self.setGeometry(300, 300, 250, 150)          
  16.         self.setWindowTitle('Message box')      
  17.         self.show()  
  18.           
  19.           
  20.     def closeEvent(self, event):  
  21.           
  22.         reply = QMessageBox.question(self, 'Message',  
  23.             "Are you sure to quit?", QMessageBox.Yes |   
  24.             QMessageBox.No, QMessageBox.No)  
  25.   
  26.         if reply == QMessageBox.Yes:  
  27.             event.accept()  
  28.         else:  
  29.             event.ignore()          
  30.           
  31.           
  32. if __name__ == '__main__':  
  33.       
  34.     app = QApplication(sys.argv)  
  35.     ex = Example()  
  36.     sys.exit(app.exec_())  

如果我们关闭一个QWidget,QCloseEvent会被生成.要修改部件行为,我们需要重新实现closeEvent()事件处理器.

[plain] view plain copy
  1. reply = QMessageBox.question(self, 'Message',  
  2.     "Are you sure to quit?", QMessageBox.Yes |   
  3.     QMessageBox.No, QMessageBox.No)  
我们显示一个有两个按钮的消息框:Yes和No.第一个串会显示在标题栏上.第二个字符串是对话框的消息文本.第三个参数指定了对话框中显示的按钮.最后一个参数是默认按钮.它是最初的键盘焦点.返回值为存储在reply变量里.

[plain] view plain copy
  1. if reply == QtGui.QMessageBox.Yes:  
  2.     event.accept()  
  3. else:  
  4.     event.ignore()   
在这里,我们测试返回值.如果我们点击了Yes按钮,我们会接受事件,它会导致部件关闭并终止程序.否则会忽略关闭事件.

PyQt5初级教程--PyQt5的第一个程序[3/13]

图片:消息框

把窗口放在屏幕正中间

下面的脚本会显示我们如何并一个窗口放到桌面正中间.

[plain] view plain copy
  1. import sys  
  2. from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication  
  3.   
  4.   
  5. class Example(QWidget):  
  6.       
  7.     def __init__(self):  
  8.         super().__init__()  
  9.           
  10.         self.initUI()  
  11.           
  12.           
  13.     def initUI(self):                 
  14.           
  15.         self.resize(250, 150)  
  16.         self.center()  
  17.           
  18.         self.setWindowTitle('Center')      
  19.         self.show()  
  20.           
  21.           
  22.     def center(self):  
  23.           
  24.         qr = self.frameGeometry()  
  25.         cp = QDesktopWidget().availableGeometry().center()  
  26.         qr.moveCenter(cp)  
  27.         self.move(qr.topLeft())  
  28.           
  29.           
  30. if __name__ == '__main__':  
  31.       
  32.     app = QApplication(sys.argv)  
  33.     ex = Example()  
  34.     sys.exit(app.exec_())    

QtGui.QDesktopWidget类担任了用户的桌面信息,包括屏幕大小.

[plain] view plain copy
  1. self.center()  
这条代码会通过调用自定义的center()方法把窗口放到正中间.

[plain] view plain copy
  1. qr = self.frameGeometry()  
我们通过这个得到主窗体的矩形说明.这包含任何窗口框架.

[plain] view plain copy
  1. cp = QDesktopWidget().availableGeometry().center()  
我们算出显示器的屏幕分辨率.通过这个,我们会得到中心点.

[plain] view plain copy
  1. qr.moveCenter(cp)  
我们的矩形已经有了它的宽和高.现在我们设置矩形的中心点到屏幕的中心.矩形的尺寸没有被修改.

[plain] view plain copy
  1. self.move(qr.topLeft())  
我们移动程序窗口的左上角到qr矩形的左上角,因此将窗口放到屏幕正中心.

PyQt5初级教程--PyQt5的第一个程序[3/13]

图片:正中心