在这里,我将根据自己的学习历程从初级到高级介绍pyqt5。因为是学到哪里就写道哪里,所以内容排版比较随意。有两点问题需要先说明:
1.虽然界面的设计可以借助qt designer进行拖拽创建,并且可以大大简化操作,提高效率。但个人感觉对于初学者来说,先理解pyqt5的各函数和方法,对加深理解大有帮助。
2.pyqt5的使用应该坚持界面于逻辑分离的原则。本节因为是基础介绍,暂未将界面于逻辑分离,后续内容会涉及。
一、基本窗口
在这里,我们先通过一个小例子对pyqt5有意个初步的认知。
import sys,time from PyQt5.QtWidgets import QApplication,QWidget #这里导入了PyQt5.QtWidgets模块,里面包含了基本的组件 if __name__=="__main__": app = QApplication(sys.argv) win = QWidget() win.resize(500,400) #窗口宽500px,高400px #win.show() #time.sleep(3) win.move(500,500) #将窗口移动到屏幕上(500,500)处 win.setWindowTitle("hello world") win.show()
注:
- 退出时app.exec_() 之所以在exec后加了一个下划线,是因为exec时pyth的关键字。
- 这个例子中引入了time模块是为了体现出窗口位置的变化过程(已注释掉)。
通过上面这个小例子,我们已经了解了pyqt5的基本功能,了解设置窗口大小,位置以及标题和窗口显示的基本操作。
显示效果如下
二、添加小控件
上一节的内容只是单个基础窗口的显示,我们还可以为窗口设置一些具有特殊功能的按键(pushbutton),并设置提示信息,提高操作友好度。下面是第二个小例子。
1 import sys 2 from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QToolTip 3 from PyQt5.QtGui import QIcon,QFont 4 from PyQt5.QtCore import QCoreApplication 5 6 7 class Win_Example(QWidget): 8 9 def __init__(self): 10 super().__init__() 11 self.initUI() 12 13 def initUI(self): 14 self.setGeometry(300,300,300,300) 15 self.setWindowTitle('第二个小例子') 16 self.setWindowIcon(QIcon('chuan.ico')) #设置窗口图标,即窗体左上角的图标,注意路径问题 17 18 pushbtn =QPushButton('退出',self) 19 pushbtn.resize(pushbtn.sizeHint()) #resize是设置按钮的大小,sizehint为默认大小 20 pushbtn.move(80,80) #设置按钮的坐标为(80,80) 21 pushbtn.clicked.connect(QCoreApplication.instance().quit) #连接事件和信号 22 23 '''设置提示信息的格式,内容''' 24 QToolTip.setFont(QFont('楷体', 15)) 25 # self.setToolTip('这是提示信息') 26 self.setToolTip('这是加粗的提示信息') #两个之间的文字会加粗显示 27 pushbtn.setToolTip('这是个按钮') 28 29 30 if __name__ == "__main__": 31 app = QApplication(sys.argv) 32 win = Win_Example() 33 win.show() 34 sys.exit(app.exec_())
在上面的小例子中,我们加入了更多的命令,并采用了面向对象的方法来编程。
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QToolTip
from PyQt5.QtGui import QIcon,QFont
from PyQt5.QtCore import QCoreApplication
- QPushButton是一个按键类,可以为窗口添加按键;
- QToolTip是提示类,可以设置提示信息;
- QIcon和QFont是用来设置图标和字体样式;
self.setWindowIcon(QIcon('chuan.ico'))
这里为窗口设置了图标,需要注意图标的路径问题。本例中,图标就在当前目录下。另外,图标图片为ico格式,最好选用32*32大小。当然,如果选择更大的图片,实际显示时会自动压缩。
pushbtn =QPushButton('退出',self)
pushbtn.resize(pushbtn.sizeHint())
pushbtn.move(80,80)
pushbtn.clicked.connect(QCoreApplication.instance().quit)
这里设置了按钮,并将pushbutton的单击事件与quit函数连接。这里涉及了信号和槽的概念,后续会专门学习,这里不做深入讨论。
resize()可以自定义窗口的大小。sizehint()窗体默认大小
QToolTip.setFont(QFont('楷体', 15))
self.setToolTip('这是加粗的提示信息')
pushbtn.setToolTip('这是个按钮')
这里为窗体和按键都设置了提示信息,请注意:... ... ...分别可以设置提示信息加粗、斜体、下划线。这三中显示方法可以单独使用,也可以组合使用。另外,尖括号中的b、i、u大小写均可。
显示效果如下:(因为qq截图的原因,图片上的鼠标箭头未能正确显示)
三、设置中心显示和对话框
我们平时在操作软件时,有时候为了防止错误操作,会增加一个交互界面确认操作,通识为了美观,通常希望窗口在屏幕中心显示。现在,我们就来学习这两个方法。在第二节的基础上,我们更新代码如下:
import sys from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QToolTip,QMessageBox,QDesktopWidget from PyQt5.QtGui import QIcon,QFont from PyQt5.QtCore import QCoreApplication class Win_Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300,300,300,300) self.setWindowTitle('第二个小例子') self.setWindowIcon(QIcon('chuan.ico')) #设置窗口图标,即窗体左上角的图标,注意路径问题 self.center_show() pushbtn =QPushButton('退出',self) pushbtn.resize(pushbtn.sizeHint()) #resize是设置按钮的大小,sizehint为默认大小 pushbtn.move(80,80) #设置按钮的坐标为(80,80) pushbtn.clicked.connect(QCoreApplication.instance().quit) #连接事件和信号 '''设置提示信息的格式,内容''' QToolTip.setFont(QFont('楷体', 15)) # self.setToolTip('这是提示信息') self.setToolTip('这是加粗的提示信息') #两个之间的文字会加粗显示 pushbtn.setToolTip('这是个按钮') def closeEvent(self, QCloseEvent): res = QMessageBox.question(self,'对话框','是否确认退出',QMessageBox.Yes|QMessageBox.No,QMessageBox.No) if res == QMessageBox.Yes: QCloseEvent.accept() else: QCloseEvent.ignore() def center_show(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) if __name__ == "__main__": app = QApplication(sys.argv) win = Win_Example() win.show() sys.exit(app.exec_())
可以看到,首先我们有新引入了两个类QmessageBox和QDesktopWidget。前者关于提示信息的对话框,后者可以提供屏幕的有关信息。
显示效果如下:
下面,我们来分析代码
def closeEvent(self, QCloseEvent):
res = QMessageBox.question(self,'对话框','是否确认退出',QMessageBox.Yes|QMessageBox.No,QMessageBox.No)
if res == QMessageBox.Yes:
QCloseEvent.accept()
else:
QCloseEvent.ignore()
这个函数功能是用户在点击右上角按键退出时,弹出消息框确认是否真的要退出。有几个知识点需要说明下:
3.1 QMessageBox消息框的几种类型
- QMessageBox.information 信息框
- QMessageBox.question 问答框
- QMessageBox.warning 警告
- QMessageBox.ctitical危险
- QMessageBox.about 关于
可根据事件的严重级别选择合适的消息框,这一点类似logger。
3.2 注意QMessageBox.question()的格式
QMessageBox.question(self,'对话框','是否确认退出',QMessageBox.Yes|QMessageBox.No,QMessageBox.No)意义是:消息框标题为“对话框“,消息框内容为“是否确认退出”,按键1为yes,按键2为no,默认按键为no。注意按键1和按键2中间一“|”分隔。
def center_show(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
设置窗口剧中的方法为通过self.frameGeometry()获得主窗口大小并传给对象qr,接着QDesktopWidget().availableGeometry().center()获取显示器分辨率并找到中心点位置,qr.moveCenter(cp)将主窗口中心移动到屏幕中心,self.move(qr.topLeft())窗口的左上角的坐标设置为qr的矩形左上角的坐标,这样就把窗口居中了。
当然,这不是唯一的方法,还可以采用如下方法:
def center(self):
screen = QDesktopWidget().screenGeometry() #用来计算显示屏幕大小,QDsktopWidget是描述显示屏幕的类
size = self.geometry() #获取窗口大小
self.move((screen.width() - size.width()) / 2,(screen.height() - size.height()) / 2)
以上两种方法都可以。