PyQt5能干什么
PyQt5的主要作用是创建UI界面,同时支持鼠标以及键盘的交互,不仅提供界面控件,还提供网络、数据库、多媒体等应用开发功能,具体来说:
UI控件(Widgets):
最基础也是最重要的,提供大量开箱即用的的UI元素,可以像搭积木一样构建界面
- 基础控件:按钮(
QPushButton)、标签(QLabel)、文本框(QLineEdit)、文本域(QTextEdit)、组合框(QComboBox)、列表(QListWidget)、表格(QTableWidget)等。 - 布局管理器:水平布局(
QHBoxLayout)、垂直布局(QVBoxLayout)、网格布局(QGridLayout)等,用于自动排列和调整控件大小,确保窗口缩放时界面依然美观。 - 高级容器:选项卡(
QTabWidget)、分组框(QGroupBox)、滚动区域(QScrollArea)、堆叠窗口(QStackedWidget)、停靠窗口(QDockWidget)等,用于组织复杂的界面结构。 - 主窗口框架:
QMainWindow类提供了标准应用程序主窗口的功能,包括菜单栏(QMenuBar)、工具栏(QToolBar)、状态栏(QStatusBar)和中心部件。
图形与视图框架:
处理大量的、交互式的2D图形对象,适合开发绘图软件、数据可视化、游戏编辑器。核心组件有:QGraphicsScene(场景,管理所有图形项)、QGraphicsView(视图,用于显示场景)、QGraphicsItem(图形项,如矩形、椭圆、自定义图形)
多媒体功能
- 音频播放:使用
QMediaPlayer和QAudioOutput播放音频文件。 - 视频播放:使用
QMediaPlayer和QVideoWidget播放视频文件。 - 摄像头访问:使用
QCamera来捕获实时摄像头画面。
网络功能
- HTTP/HTTPS 请求:通过
QNetworkAccessManager进行网络通信,支持 GET、POST 等操作,比 Python 标准的urllib更强大、更易用。 - TCP/UDP 通信:提供了
QTcpSocket,QTcpServer,QUdpSocket等类,用于开发低层的网络应用,如聊天程序、自定义协议客户端/服务器。 - WebSocket:支持现代 WebSocket 协议。
数据库连接
- 通过
QtSql模块提供了统一的接口来操作各种数据库,如 SQLite、MySQL、PostgreSQL、ODBC 等。 - 内置了非常方便的模型/视图类(如
QSqlTableModel),可以轻松地将数据库中的表与UI控件(如QTableView)绑定,实现数据的自动显示和编辑。
多线程(QThread)
桌面应用的UI主线程必须保持响应,否则会“卡住”。PyQt5 提供了 QThread 类,可以轻松地将耗时的操作(如下载文件、复杂计算)放到子线程中运行,并通过信号(Signal)与槽(Slot) 机制与主线程通信,更新UI进度,保证程序的流畅性
样式与主题(QSS - Qt Style Sheets)
类似于 Web 开发中的 CSS,你可以使用 QSS 来极大地美化应用程序的界面,可以轻松地自定义控件的外观、颜色、字体、边框、背景等,从而打造出独一无二的、现代化的UI风格,而无需修改代码逻辑
基本控件介绍
QMainWindow:
主窗口类(主界面),可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件,其中中心窗口是最重要的,可以是任何Qt窗口部件,常用成员函数:
- setCentralWidget():设置中心窗口部件
- setMenuBar():设置菜单栏
- addToolBar():添加工具栏
- statusBar():获取状态栏
- show():显示主窗口
Qwidget:
是Qt框架中所有用户界面的基类,包括窗口、对话框、按钮、标签、文本框等,此外还提供一些基本的用户界面功能,例如绘制、事件处理、布局等。
QWidget提供了一些常用的属性和方法,例如size()、pos()、setWindowTitle()等,以便于管理和操作界面部件。
在创建自定义用户界面部件时,我们可以从QWidget派生出我们自己的部件类,并通过重载其成员函数来实现自定义行为。例如,我们可以通过重载QWidget的paintEvent()函数来绘制自己的部件,或者通过重载其mousePressEvent()函数来处理鼠标点击事件
QMain Window、Qwidget、QDialog的区别:
QDialog: 是对话窗口的基类,没有菜单栏、工具栏、状态栏。 QMainWindow:可以包含菜单栏、工具栏、状态栏和标题栏,是最常见的形式。 QWidget: 不确定窗口的用途,就使用Qwidget。
Spacers控件
用于布局的空白控件,在布局中创建空白区域来分隔其它控件,空白区域的大小由其内部设置size_policy控制。
该控件有两种类型:水平(QSpacerItem)和垂直(QSpacerItem),可以使用QHBoxLayout或QVBoxLayout将Spacer控件添加到布局中。在添加Spacer控件时,您可以指定其最小大小、最大大小和首选大小,以及其大小策略
Qlabel控件
显示文本或图像的控件,它通常被用于显示静态文本信息,可以通过设置其文本、字体、颜色、对齐方式等属性来自定义标签的样式和布局。可以将QLabel放置在主窗口、对话框或其他控件上,以便在应用程序中提供帮助文本、说明、状态消息等。
方法:
-
setText(text): 设置文本内容
-
setPixmap(pixmap): 设置图像内容
-
setAlignment(alignment): 设置文本或图像的对齐方式
-
setWordWrap( on): 当文本过长时是否自动换行
-
setFixedSize(width, height): 设置控件的固定大小
-
setStyleSheet(styleSheet): 设置控件的样式表
属性:
- text(): 返回控件的文本内容
- pixmap(): 返回控件的图像内容
- alignment(): 返回控件的对齐方式
- wordWrap(): 返回控件是否自动换行
- font(): 返回控件的字体
- color(): 返回控件的颜色
常用信号:
- linkActivated:当控件中包含超链接时,用户单击链接时触发此信号。
- linkHovered:当用户将鼠标悬停在超链接上时,触发此信号。
- linkPressed:当用户按下并释放鼠标按钮时,同时鼠标位于超链接上时,触发此信号。
综合案例
|
|

QLineEdit控件
该控件用于接收用户输入的单行文本编辑,允许输入和编辑文本信息; 同时也可以限定输入内容的形式比如只允许输入数字、字母或特定字符,或者限定输入内容长度; 可以使用信号和槽机制来处理用户输入的文本,以便在应用程序中执行特定的操作或验证用户输入的有效性。
方法:
- setAlignment(alignment):设置文本的对齐方式,alignment可以是Qt.AlignLeft、Qt.AlignRight、Qt.AlignCenter等值之一
- setPlaceholderText(text):设置控件的占位符文本,当控件没有内容时显示的文本
- setReadOnly(readOnly):设置控件是否为只读模式
- setValidator(validator):设置控件的输入验证器,用于限制用户输入的内容
- textChanged.connect(slot):文本改变时的信号,连接到相应的槽函数
属性:
- text():获取或设置控件的文本内容
- setText(text):设置控件的文本内容
- clear():清空控件的文本内容
综合案例
|
|

QTextEdit
该控件可以用于显示和编辑富文本的多行文本编辑控件。它可以用于创建编辑器、日记、HTML文本查看器等。 可以在文本中插入多媒体内容,如图像、超链接、HTML表格等,并且可以在文本中使用样式来设置字体、颜色、背景、对齐等。QTextEdit还支持拼写检查、撤销/重做、自动缩进、文本选择等基本编辑功能
综合案例
|
|

QDialog
该控件是常用的对话窗口,为QWidget的子类,例如询问用户是否需要保存文件,输入数据或显示一些信息,可以设置对话框的标题、大小、位置等属性,也可以添加各种控件,例如标签、按钮、文本框等,可以捕获对话框关闭事件和其他事件,可以返回一些数据或响应用户的操作。
方法:
- exec_():将对话框设置为模态并运行对话框的事件循环,直到对话框被关闭。此方法通常用于从对话框中获取一些数据或响应用户的操作。
- show():显示对话框,但不将其设置为模态。此方法通常用于显示一些信息或提供一些选项。
- done(int result):设置对话框的返回值,并关闭对话框。此方法通常在用户进行某些操作后调用,以便通知调用方对话框的结果。
- accept():设置对话框的返回值为QDialog.Accepted,并关闭对话框。此方法通常在用户确认某些操作后调用,以便通知调用方对话框的结果。
- ect():设置对话框的返回值为QDialog.Rejected,并关闭对话框。此方法通常在用户取消某些操作后调用,以便通知调用方对话框的结果。
- setButtonLayout(list):设置对话框底部的按钮布局。参数list应该是一个QDialogButtonBox中定义的一组按钮类型,例如QDialogButtonBox.Ok | QDialogButtonBox.Cancel
- open():将对话框设置为模态并运行对话框的事件循环,直到对话框被关闭。此方法与exec_()方法类似,但可以方便地打开多个对话框
除了上述方法外,QDialog还提供了一些其他方法,例如resize()、move()、close()、setVisible()等,这些方法与QWidget类似,用于设置对话框的大小、位置、可见性等
属性:
- windowTitle:对话框的标题
- windowIcon:对话框的图标
- sizeGripEnabled:是否显示调整大小的手柄,默认为False
- layout:对话框的布局管理器,用于控制对话框内部控件的位置和大小
- modal:是否将对话框设置为模态,即禁止用户与其他窗口交互,直到对话框被关闭,默认为True。
- result:对话框的返回值,通常用于表示用户的操作或输入。如果对话框是通过exec_()方法调用的,则返回值是对话框的退出码(通常是QDialog.Accepted或QDialog.Rejected);如果对话框是通过show()方法调用的,则返回值始终是None
- sizeHint:对话框的推荐大小。
- acceptMode:对话框的接受模式,可以是QFileDialog.AcceptOpen(打开文件)、QFileDialog.AcceptSave(保存文件)或QFileDialog.AcceptSave(选择文件夹)
- rejectAction:当用户按下Esc键或者点击“取消”按钮时,对话框执行的操作。默认情况下,对话框将执行reject()方法并关闭
信号:
- finished(int result):当对话框关闭并且返回值已经设置时发出。参数result表示对话框的返回值
- accepted():当用户确认某些操作并调用accept()方法时发出
- rejected():当用户取消某些操作并调用reject()方法时发出
- resizeEvent(event):当对话框的大小改变时发出。可以重写此方法来执行一些特定的操作
几种类型
- 普通对话框(QDialog):最基本的对话框类型,用于显示消息、获取输入、提供选项等。它可以通过设置各种属性和使用布局管理器来控制对话框的大小、位置和内容
- 文件对话框(QFileDialog):用于选择文件或文件夹的对话框。可以使用QFileDialog的静态方法创建各种类型的文件对话框,例如打开文件对话框、保存文件对话框、选择文件夹对话框等。
- 字体对话框(QFontDialog):用于选择字体和字号的对话框。可以使用QFontDialog的静态方法创建字体对话框。
- 颜色对话框(QColorDialog):用于选择颜色的对话框。可以使用QColorDialog的静态方法创建颜色对话框。
- 输入对话框(QInputDialog):用于获取用户输入的对话框。可以使用QInputDialog的静态方法创建各种类型的输入对话框,例如文本输入对话框、整数输入对话框、浮点数输入对话框等。
- 消息框(QMessageBox):用于显示消息和提供选项的对话框。可以使用QMessageBox的静态方法创建各种类型的消息框,例如信息框、警告框、错误框、询问框等.
- 鼠标指针对话框(QCursor):用于显示不同类型的鼠标指针。可以使用QCursor的静态方法创建各种类型的鼠标指针对话框,例如箭头、十字形、等待指针等。
综合案例
|
|

容器
常见的PyQt容器有:
- QMainWindow:主窗口容器,通常包含菜单栏、工具栏、状态栏等
- QWidget:基本的用户界面元素容器,可以作为其他容器的子容器
- QGroupBox:分组框容器,可以将相关的组件放到一个分组框中,使它们更易于组织和查看
- QTabWidget:选项卡容器,可以在多个选项卡中放置不同的组件,让用户轻松地在它们之间切换
- QStackedWidget:堆栈容器,可以在同一位置上堆叠多个组件,只显示其中的一个,让用户可以轻松地在它们之间切换
- QScrollArea:滚动区域容器,当容器中的组件太大,无法在当前视图中完全显示时,可以使用滚动区域容器
- QSplitter:拆分器容器,可以将容器水平或垂直拆分为两个或更多子容器,让用户可以自由地调整它们的大小
- QToolBar:工具栏容器,可以在主窗口或其他容器中放置多个工具栏,让用户可以快速访问常用功能
QGroupBox使用示例:
|
|

QTabWidget使用示例:
|
|

QStackedWidget使用示例:
|
|

QSplitters使用示例:
|
|

布局管理器
QFormLayout
用于构建图形用户界面(GUI)中表单的布局管理器。它可以在表单中自动地安排各种控件(例如文本框、复选框、下拉框等)的位置和大小,以便它们以最优化的方式显示在表单上。
- 简化表单的设计和排版工作,以及提高表单的可读性和易用性
- 根据表单中控件的类型和数量,自动地生成最佳的布局
- 提供了一些常用的功能,例如表单边距、控件间距、对齐方式、自动换行等
QGridLayout
用于将控件以网格的形式排列在窗口中。每个单元格可以包含一个控件,且所有单元格大小相等。控件可以跨越多个行和列,这是通过指定控件的位置以及它在行和列中所占的单元格数量来实现的。重要特点:
- 创建GridLayout对象:可以通过将QWidget作为参数传递给QGridLayout构造函数来创建一个GridLayout对象。然后可以使用addWidget()方法将控件添加到布局中
- 指定控件的位置:可以使用addWidget()方法的第二个和第三个参数来指定控件的位置。例如,addWidget(button, 0, 0)将button添加到第0行和第0列的单元格中
- 控件的大小和跨度:可以使用addWidget()方法的第四个和第五个参数来指定控件在行和列中所占的单元格数量。例如,addWidget(label, 0, 0, 1, 2)将label添加到第0行和第0列的单元格中,并让它跨越第0列和第1列的两个单元格
- 添加空白单元格:可以使用addSpacing()方法添加空白的单元格,从而调整控件之间的距离
- 对齐方式:可以使用setAlignment()方法设置控件在单元格中的对齐方式。可以指定水平和垂直方向的对齐方式,也可以将对齐方式设置为水平和垂直方向的组合
- 自动调整大小:可以使用setColumnStretch()和setRowStretch()方法来设置单元格的大小。可以使用addStretch()方法添加一个伸缩项,以便在窗口大小改变时自动调整大小
信号与槽以及关联控件
信号与槽的介绍
信号是用于在对象之间传递信息的一种机制。一个信号表示了一个事件或状态的变化,当这个事件或状态变化时,信号被发射(emit)。可以将信号连接到一个或多个槽函数中,当信号被发射时,连接的槽函数会被调用执行。槽函数则是用于接收和处理信号的函数。
常用**connect()**方法来将信号连接到槽函数中,该方法的基本语法为:
|
|
sender表示发送信号的对象,signal表示信号的名称,connect()方法将信号signal连接到receiver对象的槽函数slot中。槽函数可以是任何可调用的Python函数
高级的信号与槽机制:
- 使用自定义信号:可以定义自己的信号,并将其连接到槽函数中。自定义信号可以通过QObject类的signal()方法定义,并使用emit()方法发射信号
- 使用Lambda表达式:可以使用Lambda表达式作为槽函数,Lambda表达式可以简洁地表示一个函数
- 使用信号参数:PyQt5中的信号可以带有参数,参数可以在信号发射时被传递给槽函数
- 一个信号连接多个槽函数:可以将一个信号连接到多个槽函数中,所有的槽函数都会在信号被发射时被调用执行
QPushButton
Qt中常用的按钮控件,可以用于在GUI中创建各种类型的按钮,如普通按钮、复选框按钮、单选框按钮等。
其构造函数为:
|
|
可以调用的方法有:
- setText()方法设置按钮的文本标签
- setIcon()方法设置按钮的图标
- setEnabled()用于设置按钮是否可用
- setFlat()用于设置按钮是否平面
- setCheckable()用于设置按钮是否可选中等
还可以通过信号与槽机制来响应用户的点击事件。当用户单击按钮时,会发出clicked()信号,可以通过连接这个信号来执行特定的操作。
|
|

QRadioButton
一个单选按钮控件,可以用于从多个互斥的选项中选择一个选项。与QCheckBox不同,QRadioButton只允许选择一个选项。
基本属性和方法:
- setText()设置按钮的文本
- isChecked()检查按钮是否被选中
- setChecked()设置按钮的选中状态
- toggled()每当按钮的选中状态发生变化时,都会发出toggled()信号
|
|

QcheckBox
一个复选框控件,可以用于从多个选项中选择一个或多个选项。与QRadioButton不同,QCheckBox允许选择多个选项。
基本属性和方法:
- setText():设置复选框的文本。
- isChecked():检查复选框是否被选中。
- setChecked():设置复选框的选中状态。
- stateChanged():每当复选框的选中状态发生变化时,都会发出stateChanged()信号
|
|

QComboBox
下拉列表控件,允许用户从预定义的一组选项中选择一个或多个选项。它通常用于表示枚举类型的值或选择一组预定义的选项。
基本属性和方法:
- addItem():添加一个项到下拉列表中。
- addItems():添加多个项到下拉列表中。
- setCurrentIndex():设置当前选中的项的索引。
- currentText():返回当前选中的项的文本。
- currentIndexChanged():每当当前选中的项发生变化时,都会发出currentIndexChanged()信号。
|
|

独立组件
滑块控件
图形用户界面中常见的一种控件,也称为滑杆、拖动条、进度条等,用于调节数值类型的参数。用户通过拖动滑块的滑块块(Thumb)来改变滑块的值,滑块的范围和步长可以通过设置属性进行控制。在PyQt5中,QSlider是用于创建滑块控件的类。
常用的属性和方法:
- value():获取当前滑块的值。
- setValue(value):设置当前滑块的值。
- minimum():获取滑块的最小值。
- setMinimum(value):设置滑块的最小值。
- maximum():获取滑块的最大值。
- setMaximum(value):设置滑块的最大值。
- singleStep():获取滑块的步长。
- setSingleStep(value):设置滑块的步长。
- sliderMoved.connect(slot):将slot函数连接到滑块拖动事件。
- valueChanged.connect(slot):将slot函数连接到滑块值改变事件。 在使用QS
|
|

树控件
一种常见的用户界面控件,它可以用来展示层次化的数据结构,例如文件系统、目录结构、组织结构等等。树控件通常由多个节点(Node)组成,每个节点都可以包含多个子节点。在PyQt5中,树控件是通过QTreeWidget类来实现的。
操作树控件方法:
- 添加节点:可以通过QTreeWidget.addTopLevelItem()方法或QTreeWidgetItem.addChild()方法来添加节点。
- 删除节点:可以通过QTreeWidget.takeTopLevelItem()方法或QTreeWidgetItem.removeChild()方法来删除节点。
- 获取节点:可以通过QTreeWidget.topLevelItem()方法或QTreeWidgetItem.child()方法来获取节点。
- 设置节点属性:可以通过QTreeWidgetItem.setText()、QTreeWidgetItem.setIcon()等方法来设置节点的文本、图标等属性。
- 选择节点:可以通过QTreeWidget.currentItem()方法获取当前选中的节点,也可以通过QTreeWidgetItem.setSelected
|
|

停靠控件
一种常用的界面布局控件,它允许用户在主窗口中创建可停靠的面板或工具栏,以便对应用程序进行灵活的布局和组织。停靠控件提供了一种便捷的方式来管理和切换应用程序的功能模块,使用户可以根据自己的需求动态调整界面布局。在 PyQt 中,停靠控件由QDockWidget类实现。它可以与 QMainWindow 或 QMainWindows 的派生类一起使用,使得应用程序的主窗口可以容纳多个停靠控件,并支持拖动、停靠和浮动等操作。
实现步骤:
- 创建停靠控件对象:使用 QDockWidget 类创建一个停靠控件对象,并将需要承载的内容设置为其子部件。
- 设置停靠属性:可以设置停靠控件的标题、图标、位置等属性,以及允许的停靠区域和停靠方式。
- 将停靠控件添加到主窗口:使用 QMainWindow 或 QMainWindows 的派生类将停靠控件添加到主窗口中的合适位置,通常使用 addDockWidget() 方法来完成。
|
|
