PyQt5学习小记
创建一个小窗口
1 | from PyQt5.QtWidgets import QApplication, QWidget |
PyQt5.QWidge
模块包含了很多基本组件
1 | app = QApplication(sys.argv) |
每个
PyQt5
应用都必须创建一个应用对象。python可以在shell里运行,这个参数提供了对脚本控制的基本功能
1 | w = QWidget() |
- QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器
- 默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)
resize,move,setWindowTitle,show
这些函数的作用都很显然
1 | sys.exit(app.exec_()) |
最后,我们进入了应用的主循环中,事件处理器这个时候开始工作。
- 主循环从窗口上接受事件,并把时间传入到派发的应用控件里。
- 当调用exit()或直接销毁主控件的时候,主循环就会结束;但是exit能确保主循环安全退出
Gui(用户图形交互界面)
1 | from PyQt5.QtWidgets import QApplication, QWidget |
==QWidget==是个类,可以继承
setGeometry
有两个作用:- 1、把窗口放到屏幕上并设置窗口大小
- 2、参数分别代表屏幕坐标的x、y和窗口大小的宽和高。也就是说这个方法是
resize()
和move()
的合体
setWindowIcon
是添加图标,不过要先创建一个QIcon对象,不过要先接受一个路径作为参数显示图标。
创建一个提示框
1 | from PyQt5.QtWidgets import (QApplication, QWidget, |
QToolTip.setFont(QFont('SansSerif', 10))
这个方法可以可以静态方法是指了提示框的字体,我们使用了10px的SansSerif字体
1 | self.setToolTip('This is a <b>QWidget</b> widget') |
- 调用
setTooltip()
创建提示框可以使用富文本格式
1 | btn = QPushButton('Button', self) |
创建一个按钮,并且为按钮添加一个提示框。按钮QPushButton的第一个参数是按钮的文本,第二个参数是按钮的父级组件
sizeHint()
方法提供了一个默认的按钮大小
退出窗口
1 | from PyQt5.QtWidgets import (QApplication, QWidget, |
- 创建一个退出的按钮
1 | qbtn.clicked.connect(QCoreApplication.instance().quit) |
- 事件传递系统在PyQt5内建的single和slot机制里面。
- 点击按钮之后,信号会被捕捉并给出既定的反应。
QCoreApplication
包含了事件的主循环,它能删除和添加所有的事件,instance()
创建了一个它的实例。QCoreApplication
是在QApplication
里面创建的。- 点击事件和能终止进程并退出应用的quit函数绑定在一起。在发送者和接受者之间建立通讯,发送者就是按钮,接受者就是应用对象。
创建一个消息框
1 | from PyQt5.QtWidgets import (QApplication, QWidget, |
QWidget
的closeEvent()
默认是关闭,可以自己改变。
1 | reply = QMessageBox.question(self, 'Message', |
- 我们创建了一个消息框,上面有两个按钮:Yes和No。第一个字符串显示在消息框的标题栏,第二个字符串显示在对话框,第三个参数是消息框的两个按钮,最后一个参数是默认选中的按钮。
- 然后下面的
reply
和’ignore’的意思就很显然了
使窗口居中
1 | def center(self): |
QtWidgets.QDesktopWidget
提供了用户的桌面信息,包括屏幕的大小
1 | qr = self.frameGeometry() |
- 得到主窗口的大小
1 | cp = QDesktopWidget().availableGeometry().center() |
- 获取显示器的分辨率,然后得到中间点的位置
- 然后把自己窗口的中心点移动到qr的中心点
1 | self.move(qr.topLeft()) |
- 然后把窗口的左上角的坐标设置为qr的矩形左上角的坐标,这样就把窗口居中了
绝对定位
1 | lb1 = QLabel('ZetCode', self) |
QtWidgets.QLabel
,继承父类的窗口,在父类的窗口中绝对位置
框布局 Boxlayout
1 | from PyQt5.QtWidgets import (QApplication, QWidget, |
我们使用HBoxLayout
和QVBoxLayout
并添加伸展因子。在窗口的右下角显示两个按钮
OK = QPushButton("OK") Cancel = QPushButton("CANCEL") hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(OK) hbox.addWidget(Cancel)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
- 我们创建一个水平布局并添加一个伸展因子和两个按钮
- 我们在两个按钮之前增加一个可伸展的空间,这将推动按钮靠右显示;相反,如果这个伸展是在按钮之后添加的将靠左显示
- 之后的程序同理
## 表格布局
```python
from PyQt5.QtWidgets import (QApplication, QWidget,
QPushButton, QToolTip, QMessageBox, QDesktopWidget, QLabel,
QHBoxLayout, QVBoxLayout, QGridLayout)
import sys
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication
class window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
grid = QGridLayout()
self.setLayout(grid)
names = ['Cls', 'Bck', '', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
positions = [(i, j) for i in range(5) for j in range(4)]
for position, name in zip(positions, names):
if name == '':
continue
button = QPushButton(name)
grid.addWidget(button, *position)
self.setGeometry(300, 300, 300, 300)
self.center()
self.setWindowTitle('Tooltips')
self.setWindowIcon(QIcon('123N.png'))
qbtn = QPushButton('Quit', self)
qbtn.clicked.connect(QCoreApplication.instance().quit)
qbtn.resize(qbtn.sizeHint())
qbtn.move(100, 100)
self.show()
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
if __name__ == '__main__':
app = QApplication(sys.argv)
w = window()
sys.exit(app.exec_())
我们要创建一个网络的按钮
1 | grid = QGridLayout() |
QGridLayout
的实例被创建并设置应用程序窗口的布局
- 然后我们创建按钮标签和网格位置列表
- zip是打包成元组,
*position
是把元组解开
建立文本输入区
1 | from PyQt5.QtWidgets import (QApplication, QWidget, |
只要在addWidget
的时候把文本区加进去就行了
创建状态栏小窗口
1 | import sys |
==主窗口QMainWindow==:这类提供了一个主要的应用程序窗口。可以用它添加应用程序的状态栏,工具栏,菜单栏
- 用
QMainWindow
类的statusBar()
来创建一个状态栏,后续调用返回的状态栏对象。 showMessage()
状态栏上显示信息
创造菜单栏
1 | import sys |
我们要创建一个菜单和菜单栏,这个菜单将终止应用程序,并创建快捷方式。
1 | exitAction = QAction(QIcon('qq.jpg'), '&Exit', self) |
QAction
可以操作菜单栏,工具栏或自定义键盘快捷键setStatusTip
创建一个当鼠标悬停在该菜单栏项是的提示。提示显示在状态栏上
1 | exitAction.triggered.connect(qApp.quit) |
- 当我们点击菜单的时候,调用
qApp.quit
终止应用程序
创造工具栏
1 | import sys |
addToolBar
加入一个工具栏,这个工具栏的作用是退出程序- 所以我们像之前菜单栏加入
action
一样,把action加进去就好了
- 所以我们像之前菜单栏加入
创建信号槽
1 | import sys |
QLCDNumber
是显示数字的模块QSlider
是滑动模块Qt.Horizontal
是水平布局,否则默认是竖直布局
1 | sld.valueChanged.connect(lcd.display) |
- 这里,我们将滚动条的valueChanged信号连接到lcd的display插槽
- sender是发出信号的对象,receiver是接受信号的对象,slot(插槽)是对信号做出反应的方法
重写事件发生器之键盘
1 |
|
判断事件发送者
1 | import sys |
1 | btn1.clicked.connect(self.buttonClicked) |
将两个按钮链接到同一个插槽
然后实现这个插槽
sender = self.sender() self.statusBar().showMessage(sender.text() + ' was pressed')
- 用sender的方法来判断信号来源