0 前言
PyQt5 是Digia的一套Qt5应用框架与python的结合,是最强大的GUI库之一
PyQt5是一个包,包内有PyQt5.QWidgets,PyQt5.QtCore等模块
pyqt5的安装
pip install PyQt5
.py文件生成exe文件请看>>Python-pyinstaller
窗口类,只用于生成页面容纳其他窗口和控件,自身不具有任何功能的QWidget类窗口,单独使用没有任何意义,通常是APP的最外层框架
继承关系:
- QWidget
- QDeskWidget
- QTabWidget
- QMainWindow
- QDialog
1 控件的几何数据 QRect,QPoint,QSize
在PyQt5中,窗口都是以矩形形式呈现,几何数据称为geometry,数据类型QRect类,数据形式(x, y, width, height)
。其中x
, y
为窗口左上角相对上级窗口或屏幕左上角的坐标,x
向右为正,y
向下为正
width
为窗口宽度,height
为窗口高度
窗口坐标是窗口左上角在屏幕或者上级窗口的坐标,称为move,数据类型QPoint类,数据形式(x, y)
窗口尺寸是窗口的宽和高,称为size,数据类型QSize类,数据形式(width, height)
1.1 方法列表
QWidget类及其子类 | 说明 |
---|---|
self.setGeometry(x, y ,width, height) | 设定几何数据,输入QRect类 |
self.move(x, y) | 设定左上角坐标,输入QPoint类 |
self.resize(width, height) | 设定窗口尺寸,输入QSize类 |
self.setFixedSize(width, height) | 固定窗口尺寸,输入QSize类 |
self.setFixedWidth(width) | 固定窗口宽度,输入数字 |
self.setFixedHeight(height) | 固定窗口高度,输入数字 |
=self.geometry() | 获取几何数据,返回QRect类 |
=self.pos() | 获取坐标数据,返回QPoint类 |
=self.size() | 获取尺寸数据,返回QSize类 |
=self.x() | 获取x轴坐标数据,返回数字 |
=self.y() | 获取y轴坐标数据,返回数字 |
=self.width() | 获取宽度数据,返回数字 |
=self.height() | 获取宽度数据,返回数字 |
QRect类 | 说明 |
---|---|
self=QRect(x, y, width, height) | 创建QRect类 |
=self.pos() | 获取坐标数据,返回QPoint类 |
=self.size() | 获取尺寸数据,返回QSize类 |
=self.x() | 获取x轴坐标数据,返回数字 |
=self.y() | 获取y轴坐标数据,返回数字 |
=self.width() | 获取宽度数据,返回数字 |
=self.height() | 获取宽度数据,返回数字 |
QPoint类 | 说明 |
---|---|
self=QPoint(x, y) | 创建QPoint类 |
=self.x() | 获取x轴坐标数据,返回数字 |
=self.y() | 获取y轴坐标数据,返回数字 |
QSize类 | 说明 |
---|---|
self=QSize(width, height) | 创建QSize类 |
=self.width() | 获取宽度数据,返回数字 |
=self.height() | 获取宽度数据,返回数字 |
2 基本窗口 QWidget
QWidget是PyQt5的核心,QWidget加任意控件就可以形成最简单的APP
2.1 方法列表
QWidget类 | 说明 |
---|---|
self=QWidget(parent) | 创建实例和标题栏parent ->父控件,可省略 |
x , y , width , height , ... | 几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) | 设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) | 设置图标icon ->QIcon类 |
self.setLayout(layout) | 载入布局,只能使用一次layout ->布局类 |
self.setToolTip(text) | 光标悬浮显示文字 |
self.show() | 以非模式显示窗口 |
self.close() | 关闭窗口 |
QIcon类 | 说明 |
---|---|
self=QIcon(file) | 创建图标 |
2.2 示例 第一个APP
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('第一个APP')
btn = QPushButton(self, '开始') # self下新建Button实例,由于没有布局,此处self不能省略
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
说明
if __name__ == '__main__':
一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import
到其他的python脚本中被调用(模块重用)执行
if __name__ == ‘__main__’:
的作用相当于C语言中的main()
函数,在 if __name__ == ‘__main__’:
下的代码只有文件作为脚本直接运行时才会被执行,而import
到其他脚本中是不会被执行的。也就是说项目必须从if __name__ == ‘__main__’:
的文件运行,这个文件可以调用其他文件,其他文件不能调用这个文件
不同的是,C语言中 main()
函数是必须的,Python中 if __name__ == ‘__main__’:
是非必须的
import sys
# code
if __name__ == '__main__':
app = QApplication(sys.argv)
# code
sys.exit(app.exec_())
在主程序运行后,首先创建实例 app = QAppliaction
,创建时需要使用sys.argv
参数
sys.argv
这个参数来自Python自带的sys
库,作用是在app运行时将键盘、鼠标等外部数据传递给app,相当于全自动运行的input()
app.exec_()
的作用是进入程序的主循环直到exit()
被调用,并在退出时返回状态代码。相当于C语言中的主程序while(1)
。不使用 app.exec_()
会导致程序闪退,因为app只有初始化没有主循环
sys.exit()
的作用是关闭窗口后退出进程
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
实例化MyWindow时,自动执行__init__
方法,__init__
方法负责继承父类初始化和调用自己写的initUI
方法完成窗口创建
3 桌面窗口 QDeskWidget
QDeskWidget是将电脑屏幕虚拟为一个窗口,方便使用QWidget类的方法读取屏幕数据,方便布局
3.1 方法列表
QDeskWidget类 | 说明 |
---|---|
self=QDeskWidget() | 创建实例 |
x , y , width , height | 几何类方法,详见窗口的几何数据,只能读取 |
3.2 示例 将窗口放置在屏幕中间
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setFixedSize(300, 300)
x = (QDesktopWidget().width() - self.width())/2
y = (QDesktopWidget().height() - self.height())/2
self.move(int(x), int(y))
self.setWindowTitle('放在屏幕中间')
btn = QPushButton(self)
btn.setText('开始')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
4 选项卡窗口 QTabWidget
QTabWidget控件提供了一个选项卡和一个页面区域,默认显示第一个选项卡的页面,通过单击各选项卡可以查看对应的界面,如果在一个窗口中显示的输入字段很多,则可以对这些字段进行拆分,分别放置在不同界面的选项卡中
4.1 方法列表
QTabWidget | 说明 |
---|---|
self=QTabWidget(parent) | 创建实例parent ->父控件,使用布局时可省略 |
self.addTab(tab, title) | 添加选项页tab ->QWidget类title ->字符串 |
self.insertTab(idx, tab, title) | 插入选项页idx ->从0开始tab ->QWidget类title ->字符串 |
self.removeTab(idx) | 移除选项页 |
self.setCurrentWidget(tab) | 设置当前可见的界面 |
self.setTabPosition() | 设置选项卡的位置:QTabWidget.North :显示在页面的上方QTabWidget.South :显示在页面的下方QTabWidget.West :显示在页面的左侧QTabWidget.East :显示在页面的右侧 |
self.setTabText(idx, title) | 设置选项页标题 |
继承自QWidget类的方法 | |
x , y , width , height , ... | 几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) | 设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) | 设置图标icon ->QIcon类 |
self.show() | 以非模式显示窗口 |
self.close() | 关闭窗口 |
4.2 示例 选项卡
import sys
from PyQt5.QtWidgets import *
class MyWindow(QTabWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('选项卡示例')
#创建3个选项卡小控件窗口
self.tab1=QWidget()
self.tab2=QWidget()
self.tab3=QWidget()
#将三个选项卡添加到顶层窗口中
self.addTab(self.tab1, '联系方式')
self.addTab(self.tab2, '个人详细信息')
self.addTab(self.tab3, '教育程度')
#每个选项卡自定义的内容
self.tab1UI()
self.tab2UI()
self.tab3UI()
def tab1UI(self):
#表单布局
layout=QFormLayout()
#添加姓名,地址的单行文本输入框
layout.addRow('姓名',QLineEdit())
layout.addRow('地址',QLineEdit())
self.tab1.setLayout(layout)
def tab2UI(self):
#表单布局,次水平布局
layout=QFormLayout()
sex=QHBoxLayout()
#水平布局添加单选按钮
sex.addWidget(QRadioButton('男'))
sex.addWidget(QRadioButton('女'))
#表单布局添加控件
layout.addRow(QLabel('性别'),sex)
layout.addRow('生日',QLineEdit())
self.tab2.setLayout(layout)
def tab3UI(self):
#水平布局
layout=QHBoxLayout()
#添加控件到布局中
layout.addWidget(QLabel('科目'))
layout.addWidget(QCheckBox('物理'))
layout.addWidget(QCheckBox('高数'))
self.tab3.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
5 主窗口 QMainWindow
QMainWindow是APP的最上层窗口,不能直接使用布局和控件,而是将其他窗口作为中央窗口(Central Widget)过渡
QMainWindow的结构分为五个部分:菜单栏(Menu Bar)、工具栏(Toolbars)、停靠窗口(Dock Widgets)、状态栏(Status Bar)和中央窗口(Central Widget)。可以用下面的图形表示:
菜单是QMenu
对象,然后将多个QMenu
对象放置在一个QMenuBar
(菜单栏)对象中。对于每个菜单,我们再为其添加动作列表,即QAction
对象。
5.1 方法列表 QMainWindow
QMainWindow类 | 说明 |
---|---|
self=QMainWindow(title) | 创建实例和标题栏title ->字符串,可省略 |
self.setCentralWidget(widget) | 将窗口设为中央窗口widget ->QWidget类 |
=self.statusBar() | 创建状态栏,返回QStatusBar类 |
=self.menuBar() | 创建菜单栏,返回QMenuBar类 |
继承自QWidget类的方法 | |
x , y , width , height | 几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) | 设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) | 设置图标icon ->QIcon类 |
self.show() | 以非模式显示窗口 |
self.close() | 关闭窗口 |
QStatusBar类 | 说明 |
---|---|
self.showMessage(message) | 设置状态栏文字message ->字符串 |
QMenuBar类 | 说明 |
---|---|
self.addAction(action) | 菜单添加动作action ->QAction类 |
self.addMenu(menu) | 菜单添加下拉菜单menu ->QMenu类 |
QMenu类 | 说明 |
---|---|
self..addAction(action) | 下拉菜单添加动作action ->QAction类 |
QAction类 | 说明 |
---|---|
self=Action(text, parent) | 创建实例和名称text ->字符串parent ->父控件,QMenuBar类或QMenu类 |
self.setShortcut('Ctrl+Q') | 快捷方式 |
self.setStatusTip(message) | 状态栏提示message ->字符串 |
self.triggered.connect(fun) | 触发的槽函数 |
5.2 示例 有菜单的APP
import sys
from PyQt5.QtWidgets import *
from PyQt5.Qt import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('有菜单的APP')
self.statusBar()
menubar = self.menuBar()
file_menu = menubar.addMenu('File')
exit_act = QAction('Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('Exit application')
exit_act.triggered.connect(qApp.quit)
file_menu.addAction(exit_act)
widget = QWidget()
self.setCentralWidget(widget)
layout = QHBoxLayout()
widget.setLayout(layout)
label = QLabel('开始')
label.setAlignment(Qt.AlignCenter)
layout.addWidget(label)
btn = QPushButton()
layout.addWidget(btn)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
6 对话窗口 QDialog
QDialog是临时弹出的交互对话框,和QWidget的区别是QDialog没有最大最小化按钮,但是多出一个帮助按钮
6.1 方法列表 QDialog
QDialog类 | 说明 |
---|---|
self=QDialog(parent, title) | 创建实例和标题栏title ->字符串parent ->父控件,使用布局时可省略 |
self.exec() | 以模式显示窗口,锁住程序以等待窗口的返回值 |
继承自QWidget类的方法 | |
x , y , width , height , ... | 几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) | 设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) | 设置图标icon ->QIcon类 |
self.setLayout(layout) | 载入布局,只能使用一次layout ->QLayout类 |
self.show() | 以非模式显示窗口 |
self.close() | 关闭窗口 |
6.2 示例 QDialog主窗口
import sys
from PyQt5.QtWidgets import *
class MyWindow(QDialog): # QWidget改为QDialog
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('垂直布局')
layout = QVBoxLayout()
self.setLayout(layout)
btn1 = QPushButton('start')
layout.addWidget(btn1)
btn2 = QPushButton('close')
layout.addWidget(btn2)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
6.3 示例 QDialog弹出窗口
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('弹出窗口')
layout = QVBoxLayout()
self.setLayout(layout)
btn = QPushButton('对话框')
btn.clicked.connect(self.showDialog)
layout.addWidget(btn)
def showDialog(self):
dialog = QDialog(self)
dialog.move(600, 500)
dialog.setFixedSize(200, 100)
btn = QPushButton('关闭窗口', dialog)
btn.move(50, 50)
btn.clicked.connect(dialog.close)
dialog.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())