1.基本学习方法
配套学习文档:it项目网www.itprojects.cn
进阶学习文档:la vie - 知乎
学习完上述基本内容后,针对需要使用的模块到对应网站或者百度搜索,参考网站如下:
可以参考PyQt官网的所有模块,地址:Modules — PyQt Documentation v5.15.4
C++具体实现的API文档,地址:https://doc.qt.io/qt-5/qtwidgets-module.html
2.主体模块介绍
PyQt中有非常多的功能模块,开发中最常用的功能模块主要有三个:
- QtCore:包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用
- QtGui:包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类
- QtWidgets:包含了一些列创建桌面应用的UI元素
2.1QtWidgets
2.1.1QtWidgets.QWidget基本介绍
- 所有可视化控件的基类
- 是一个最简单的空白控件
- 控件是用户界面最小的元素
- 接受各种事件,鼠标,键盘
- 绘制在桌面上,展示给用户看
- 每一个控件都是矩形的,它们按照Z轴顺序排序
- 控件由其父控件和前面的控件剪切
- 没有父控件的控件,称之为窗口
函数和类 | 使用项目数 |
---|---|
1. QApplication() | 用在(261)个项目中 |
2. QWidget() | 用在(215)个项目中 |
3. QLabel() | 用在(199)个项目中 |
4. QPushButton() | 用在(192)个项目中 |
5. QVBoxLayout() | 用在(169)个项目中 |
6. QLineEdit() | 用在(150)个项目中 |
7. QMainWindow() | 用在(147)个项目中 |
8. QHBoxLayout() | 用在(142)个项目中 |
9. QAction() | 用在(118)个项目中 |
10. QComboBox() | 用在(117)个项目中 |
11. QGridLayout() | 用在(113)个项目中 |
12. QMenu() | 用在(99)个项目中 |
13. QDialog() | 用在(93)个项目中 |
14. QCheckBox() | 用在(88)个项目中 |
15. QMenuBar() | 用在(84)个项目中 |
16. QTabWidget() | 用在(82)个项目中 |
17. QStatusBar() | 用在(80)个项目中 |
18. QFrame() | 用在(75)个项目中 |
19. QSizePolicy() | 用在(75)个项目中 |
20. QGroupBox() | 用在(71)个项目中 |
21. QSpacerItem() | 用在(65)个项目中 |
22. QTextEdit() | 用在(59)个项目中 |
23. QSpinBox() | 用在(59)个项目中 |
24. QListWidget() | 用在(57)个项目中 |
25. QProgressBar() | 用在(56)个项目中 |
26. QRadioButton() | 用在(49)个项目中 |
27. QPlainTextEdit() | 用在(47)个项目中 |
28. QTableWidgetItem() | 用在(45)个项目中 |
29. QTextBrowser() | 用在(43)个项目中 |
30. QTableWidget() | 用在(42)个项目中 |
31. QFormLayout() | 用在(38)个项目中 |
32. QSplitter() | 用在(37)个项目中 |
33. QDialogButtonBox() | 用在(37)个项目中 |
34. QSlider() | 用在(36)个项目中 |
35. QScrollArea() | 用在(35)个项目中 |
36. QListWidgetItem() | 用在(33)个项目中 |
37. QMessageBox() | 用在(33)个项目中 |
38. QDoubleSpinBox() | 用在(32)个项目中 |
39. QTreeWidget() | 用在(29)个项目中 |
40. QStackedWidget() | 用在(28)个项目中 |
41. QToolBar() | 用在(27)个项目中 |
42. QDesktopWidget() | 用在(26)个项目中 |
43. QGraphicsView() | 用在(26)个项目中 |
44. QToolButton() | 用在(25)个项目中 |
45. QTreeWidgetItem() | 用在(24)个项目中 |
46. QTableView() | 用在(23)个项目中 |
47. QTreeView() | 用在(22)个项目中 |
48. QDockWidget() | 用在(21)个项目中 |
49. QGraphicsScene() | 用在(21)个项目中 |
50. QFileDialog() | 用在(17)个项目中 |
51. QListView() | 用在(17)个项目中 |
52. QButtonGroup() | 用在(16)个项目中 |
53. QSystemTrayIcon() | 用在(14)个项目中 |
54. QLCDNumber() | 用在(12)个项目中 |
55. QGraphicsTextItem() | 用在(11)个项目中 |
56. QProgressDialog() | 用在(11)个项目中 |
57. QActionGroup() | 用在(11)个项目中 |
58. QDateTimeEdit() | 用在(10)个项目中 |
59. QShortcut() | 用在(9)个项目中 |
60. QCompleter() | 用在(7)个项目中 |
61. QOpenGLWidget() | 用在(7)个项目中 |
62. QGraphicsObject() | 用在(7)个项目中 |
63. QWizardPage() | 用在(7)个项目中 |
64. QScrollBar() | 用在(6)个项目中 |
65. QGraphicsPathItem() | 用在(6)个项目中 |
66. QFileSystemModel() | 用在(6)个项目中 |
67. QDateEdit() | 用在(5)个项目中 |
68. QFontComboBox() | 用在(5)个项目中 |
69. QGraphicsLineItem() | 用在(5)个项目中 |
70. QGraphicsRectItem() | 用在(5)个项目中 |
参考:Python PyQt5.QtWidgets模块,常用函数和类
2.1.2QtWidgets.QWidget控件创建
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PyQt程序")
# 在窗口里面添加控件
btn = QPushButton("按钮")
# 设置按钮的父亲是当前窗口,等于是添加到窗口中显示
btn.setParent(w)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
2.1.3QtWidgets.QWidget大小位置
(1)理论支撑:控件的坐标系统
(2)API
关于获取元素的API:
注意一下:这里的xy指的是顶层控件相当于桌面的相对位置,而weight与height是除去窗口框架的内容尺寸。
关于设置相关API:
注意:resize改的是用户区域的尺寸,setGeometry()函数必须等待显示成功之后再发挥作用。
import sys
from PyQt5.Qt import *
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
# print(QWidget.__bases__) #打印他的父类 也可以安装ctrl键 鼠标点击即可查看
# print(QWidget.mro()) # 向上查看所有的类 链条式
window.show()
# 设置的是用户区域(去除框架部分) 前两个坐标是用户区域的坐标,后两个坐标是用户区域的尺寸
# 但是,必须这行代码必须设置在show()函数后面,等显示成功时再去包装它
window.setGeometry(0,0,150,150)
# 应用程序执行,进入到消息循环
sys.exit(app.exec_())
import sys
from PyQt5.Qt import *
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
# print(QWidget.__bases__) #打印他的父类 也可以安装ctrl键 鼠标点击即可查看
# print(QWidget.mro()) # 向上查看所有的类 链条式
window.move(200,100)
window.resize(500,500)
label = QLabel(window)
label.setText("社会顺")
label.move(100,100)
label.setStyleSheet("background-color:cyan;")
def Cao1():
new_content = label.text() + "社会顺"
label.setText(new_content)
label.adjustSize() # 自适应调整大小
btn = QPushButton(window)
btn.setText("增加内容")
btn.move(100,300)
btn.clicked.connect(Cao1)
window.show()
# 设置的是用户区域(去除框架部分) 前两个坐标是用户区域的坐标,后两个坐标是用户区域的尺寸
# 但是,必须这行代码必须设置在show()函数后面,等显示成功时再去包装它
# window.setGeometry(0,0,150,150)
# 应用程序执行,进入到消息循环
sys.exit(app.exec_())
最大和最小尺寸
import sys
from PyQt5.Qt import *
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("最大最小尺寸")
window.setMaximumSize(500,500)
window.setMinimumSize(100,100)
window.show()
sys.exit(app.exec_())
内容外边距
2.1.4QtWidgets.QWidget鼠标事件
(1)设置鼠标形状
import sys
from PyQt5.Qt import *
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("内容边距的设定")
window.resize(500,500)
# window.setCursor(Qt.ForbiddenCursor)
label = QLabel(window)
label.setText("Hello Neo")
label.resize(100,100)
label.setStyleSheet("background-color:cyan;")
label.setCursor(Qt.ForbiddenCursor)
window.show()
sys.exit(app.exec_())
(2)重置形状
unsetCursor()
(3)获取鼠标
cursor()->QCursor
(4)鼠标跟踪
(5)QCursor对象
- pixmap()
- pos()
- setPos(x,y)
2.1.5QtWidgets.QWidget鼠标事件
(1)显示和关闭事件
(2)移动事件
moveEvent(QMoveEvent)
(3)调整大小
resizeEvent(QResizeEvent)
(4)鼠标事件
(5)键盘事件
(6)焦点事件
(7)拖拽事件
(8)绘制事件
显示控件,更新控件时调用
paintEvent(QPaintEvent)
(9)改变事件
changeEvent(QEvent)
(10)右键菜单
访问右键菜单时调用
contextMenuEvent(QContextMenuEvent)
(11)输入法
inputMethodEvent(QInputMethodEvent)
3.各窗体详解
3.1布局控件
3.1.1QtWidgets.QGridLayout()
(1)addWidget
https://doc.qt.io/qt-5/qgridlayout.html#addWidget-1
可以看到有2个重载版本:
1.void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
Adds the given widget to the cell grid at row, column. The top-left position is (0, 0) by default.
The alignment is specified by alignment. The default alignment is 0, which means that the widget fills the entire cell.
翻译:
将给定的小部件添加到单元格网格的行、列。默认情况下,左上角位置为(0,0)。
对齐由对齐指定。默认对齐方式为0,这意味着小部件将填充整个单元格。
2.void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
翻译:
此版本将给定的小部件添加到单元格网格,跨越多行/列。该单元格将从fromRow、fromColumn开始,跨越rowSpan行和columnSpan列。小部件将具有给定的对齐方式。
如果rowSpan和/或columnSpan为-1,则小部件将分别扩展到底部和/或右边缘。
使用方法
1.第一个版本
void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
这个版本对应的行列规则的情况。
QGridLayout* gridlayout=new QGridLayout;
gridlayout->addWidget(m_lab_Near, 0, 0);
gridlayout->addWidget(m_spinbox_Near, 0, 1);
gridlayout->addWidget(m_lab_Far, 1, 0);
gridlayout->addWidget(m_spinbox_Far, 1, 1);
2.第二个版本
void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
这个版本对应行列不规则的情况
如上图,红色表示坐标,窗口1横向跨越了2个单元格,那么 int rowSpan = 2 ;纵向跨越了2个单元格, 那么int columnSpan = 2
此窗口产生的代码如下:
QGridLayout* gridLayout = new QGridLayout;
QWidget widget1;
QWidget widget2;
QWidget widget3;
QWidget widget4;
QWidget widget5;
QWidget widget6;
gridLayout->addWidget(widgets1, 0, 0, 2, 2); //窗口1
gridLayout->addWidget(widgets2, 0, 2, 1, 1); //窗口2
gridLayout->addWidget(widgets3, 1, 2, 1, 1); //窗口3
gridLayout->addWidget(widgets4, 2, 0, 1, 1); //窗口4
gridLayout->addWidget(widgets5, 2, 1, 1, 1); //窗口5
gridLayout->addWidget(widgets6, 2, 2, 1, 1); //窗口6
3.2图片展示交互控件Graphics
3.1QGraphicsScene、QGraphicsItem与QGraphicsView
Qt开发技术:图形视图框架(一)基本介绍_长沙红胖子Qt的博客-CSDN博客_qt显示框架
Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解_长沙红胖子Qt的博客-CSDN博客_qt场景视图