2
2
3
3
##本章学习Qt的基本功能
4
4
5
-
6
- 这个简单的小例子展示的是一个小窗口。但是我们可以在这个小窗口上面做很多事情,改变大小,最大化,最小化等,这需要很多代码才能实现。这在很多应用中很常见,没必要每次都要重写这部分代码,Qt已经提供了这些功能。PyQt5是一个高级的工具集合,相比使用低级的工具,PyQt能省略上百行代码。
7
-
8
5
## 例1,简单的窗口
9
6
10
- ``` python
7
+ 这个简单的小例子展示的是一个小窗口。但是我们可以在这个小窗口上面做很多事情,改变大小,最大化,最小化等,这需要很多代码才能实现。这在很多应用中很常见,没必要每次都要重写这部分代码,Qt已经提供了这些功能。PyQt5是一个高级的工具集合,相比使用低级的工具,能省略上百行代码。
8
+
9
+ ``` python
11
10
# !/usr/bin/python3
12
11
# -*- coding: utf-8 -*-
13
12
@@ -19,7 +18,7 @@ window in PyQt5.
19
18
20
19
author: Jan Bodnar
21
20
website: zetcode.com
22
- last edited: January 2015
21
+ Last edited: August 2017
23
22
"""
24
23
25
24
import sys
@@ -38,7 +37,7 @@ if __name__ == '__main__':
38
37
39
38
sys.exit(app.exec_())
40
39
```
41
- 运行上面的代码,能展示出一个小窗口。下面是每行代码的讲解。
40
+ 运行上面的代码,能展示出一个小窗口。
42
41
```
43
42
import sys
44
43
from PyQt5.QtWidgets import QApplication, QWidget
@@ -51,7 +50,7 @@ app = QApplication(sys.argv)
51
50
```
52
51
w = QWidget()
53
52
```
54
- QWidget空间是一个用户界面的基本空间 ,它提供了基本的应用构造器。默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)。
53
+ QWidge控件是一个用户界面的基本控件 ,它提供了基本的应用构造器。默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)。
55
54
```
56
55
w.resize(250, 150)
57
56
```
@@ -63,17 +62,17 @@ move()是修改控件位置的的方法。它把控件放置到屏幕坐标的(3
63
62
```
64
63
w.setWindowTitle('Simple')
65
64
```
66
- 我们给这个窗口添加了一个标题,标题在标题栏展示(虽然这看起来是一句废话,但是后面还有很多栏 ,还是要注意一下,多了就蒙了)。
65
+ 我们给这个窗口添加了一个标题,标题在标题栏展示(虽然这看起来是一句废话,但是后面还有各种栏 ,还是要注意一下,多了就蒙了)。
67
66
```
68
67
w.show()
69
68
```
70
69
show()能让控件在桌面上显示出来。控件在内存里创建,之后才能在显示器上显示出来。
71
70
```
72
71
sys.exit(app.exec_())
73
72
```
74
- 最后,我们进入了应用的主循环中,事件处理器这个时候开始工作。主循环从窗口上接收事件,并把事件传入到派发到应用控件里。当调用exit() 方法或直接销毁主控件时,主循环就会结束。sys.exit()方法能确保主循环安全退出。外部环境能通知主控件怎么结束。
73
+ 最后,我们进入了应用的主循环中,事件处理器这个时候开始工作。主循环从窗口上接收事件,并把事件传入到派发到应用控件里。当调用 ` exit() ` 方法或直接销毁主控件时,主循环就会结束。` sys.exit() ` 方法能确保主循环安全退出。外部环境能通知主控件怎么结束。
75
74
76
- exec_ ()之所以有个下划线,是因为exec是一个Python的关键字。
75
+ ` exec_() ` 之所以有个下划线,是因为exec是一个Python的关键字。
77
76
78
77
程序预览:
79
78
@@ -82,6 +81,9 @@ exec_()之所以有个下划线,是因为exec是一个Python的关键字。
82
81
## 例2,带窗口图标
83
82
84
83
窗口图标通常是显示在窗口的左上角,标题栏的最左边。下面的例子就是怎么用PyQt5创建一个这样的窗口。
84
+
85
+ 在某些环境下,图标显示不出来。如果你遇到了这个问题,看我在Stackoverfolw的[ 回答] ( https://stackoverflow.com/questions/44080247/pyqt5-does-now-show-icons/45439678#45439678 )
86
+
85
87
``` python
86
88
# !/usr/bin/python3
87
89
# -*- coding: utf-8 -*-
@@ -92,9 +94,9 @@ ZetCode PyQt5 tutorial
92
94
This example shows an icon
93
95
in the titlebar of the window.
94
96
95
- author : Jan Bodnar
96
- website : zetcode.com
97
- last edited: January 2015
97
+ Author : Jan Bodnar
98
+ Website : zetcode.com
99
+ Last edited: August 2017
98
100
"""
99
101
100
102
import sys
@@ -123,42 +125,54 @@ if __name__ == '__main__':
123
125
124
126
app = QApplication(sys.argv)
125
127
ex = Example()
126
- sys.exit(app.exec_())
128
+ sys.exit(app.exec_())
127
129
```
130
+
128
131
前一个例子是使用的[ 过程式编程] ( https://www.wikiwand.com/zh/%E8%BF%87%E7%A8%8B%E5%BC%8F%E7%BC%96%E7%A8%8B ) 。Python还支持[ 面向对象] ( https://www.wikiwand.com/zh/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1 ) 的编程:
132
+
129
133
```
130
134
class Example(QWidget):
131
135
132
136
def __init__(self):
133
137
super().__init__()
134
138
...
135
139
```
140
+
136
141
面向对象编程最重要的三个部分是类(class)、数据和方法。我们创建了一个类的调用,这个类继承自QWidget。这就意味着,我们调用了两个构造器,一个是这个类本身的,一个是这个类继承的。super()构造器方法返回父级的对象。` __init__() ` 方法是构造器的一个方法。
142
+
137
143
```
138
144
self.initUI()
139
145
```
146
+
140
147
使用` initUI() ` 方法创建一个GUI。
148
+
141
149
```
142
150
# 自己准备一个web.png
143
151
self.setGeometry(300, 300, 300, 220)
144
152
self.setWindowTitle('Icon')
145
153
self.setWindowIcon(QIcon('web.png'))
146
154
```
147
- 上面的三个方法都继承自` QWidget ` 类。setGeometry()有两个作用:把窗口放到屏幕上并且设置窗口大小。参数分别代表屏幕坐标的x、y和窗口大小的宽、高。也就是说这个方法是resize()和move()的合体。最后一个方法是添加了图标。先创建一个QIcon对象,然后接受一个路径作为参数显示图标。
155
+
156
+ 上面的三个方法都继承自` QWidget ` 类。` setGeometry() ` 有两个作用:把窗口放到屏幕上并且设置窗口大小。参数分别代表屏幕坐标的x、y和窗口大小的宽、高。也就是说这个方法是` resize() ` 和` move() ` 的合体。最后一个方法是添加了图标。先创建一个QIcon对象,然后接受一个路径作为参数显示图标。
157
+
158
+
148
159
```
149
160
if __name__ == '__main__':
150
161
151
162
app = QApplication(sys.argv)
152
163
ex = Example()
153
164
sys.exit(app.exec_())
154
- ````
165
+ ```
166
+
155
167
应用和示例的对象创立,主循环开始。
156
168
程序预览:
157
169
158
170
![ icon] ( ./images/1-icon.png )
159
171
172
+
160
173
## 例3,提示框
161
- ```
174
+
175
+ ``` python
162
176
# !/usr/bin/python3
163
177
# -*- coding: utf-8 -*-
164
178
@@ -168,9 +182,9 @@ ZetCode PyQt5 tutorial
168
182
This example shows a tooltip on
169
183
a window and a button.
170
184
171
- author : Jan Bodnar
172
- website : zetcode.com
173
- last edited: January 2015
185
+ Author : Jan Bodnar
186
+ Website : zetcode.com
187
+ Last edited: August 2017
174
188
"""
175
189
176
190
import sys
@@ -209,20 +223,24 @@ if __name__ == '__main__':
209
223
ex = Example()
210
224
sys.exit(app.exec_())
211
225
```
212
- 在这个例子中,我们为应用创建了两个提示框。
226
+ 在这个例子中,我们为应用创建了一个提示框。
227
+
213
228
```
214
229
QToolTip.setFont(QFont('SansSerif', 10))
215
230
```
216
231
这个静态方法设置了提示框的字体,我们使用了10px的SansSerif字体。
232
+
217
233
```
218
234
self.setToolTip('This is a <b>QWidget</b> widget')
219
235
```
220
236
调用` setTooltip() ` 创建提示框可以使用富文本格式的内容。
237
+
221
238
```
222
239
btn = QPushButton('Button', self)
223
240
btn.setToolTip('This is a <b>QPushButton</b> widget')
224
241
```
225
- 创建了一个按钮,并且为按钮添加了一个提示框。
242
+ 创建一个按钮,并且为按钮添加了一个提示框。
243
+
226
244
```
227
245
btn.resize(btn.sizeHint())
228
246
btn.move(50, 50)
@@ -241,8 +259,9 @@ btn.move(50, 50)
241
259
```
242
260
QPushButton(string text, QWidget parent = None)
243
261
```
244
- text参数是想要显示的按钮名称,parent参数是放在按钮上的组件,在我们的 例子里,这个参数是QWidget。应用中的组件都是一层一层(继承而来的?)的,在这个层里,大部分的组件都有自己的父级,没有父级的组件,是顶级的窗口。
245
- ```
262
+ ` text ` 参数是想要显示的按钮名称,` parent ` 参数是放在按钮上的组件,在我们的 例子里,这个参数是` QWidget ` 。应用中的组件都是一层一层(继承而来的?)的,在这个层里,大部分的组件都有自己的父级,没有父级的组件,是顶级的窗口。
263
+
264
+ ``` python
246
265
# !/usr/bin/python3
247
266
# -*- coding: utf-8 -*-
248
267
@@ -253,9 +272,9 @@ This program creates a quit
253
272
button. When we press the button,
254
273
the application terminates.
255
274
256
- author : Jan Bodnar
257
- website : zetcode.com
258
- last edited: January 2015
275
+ Author : Jan Bodnar
276
+ Website : zetcode.com
277
+ Last edited: August 2017
259
278
"""
260
279
261
280
import sys
@@ -290,18 +309,21 @@ if __name__ == '__main__':
290
309
sys.exit(app.exec_())
291
310
```
292
311
这里创建了一个点击之后就退出窗口的按钮。
312
+
293
313
```
294
314
from PyQt5.QtCore import QCoreApplication
295
315
```
296
316
程序需要QtCore对象。
317
+
297
318
```
298
319
qbtn = QPushButton('Quit', self)
299
320
```
300
- 创建一个继承自`QPushButton`的按钮。第一个参数是按钮的文本,第二个参数是按钮的父级组件,这个例子中,父级组件就是我们创建的继承自Qwidget的Example类。
321
+ 创建一个继承自` QPushButton ` 的按钮。第一个参数是按钮的文本,第二个参数是按钮的父级组件,这个例子中,父级组件就是我们创建的继承自` Qwidget ` 的` Example ` 类。
322
+
301
323
```
302
324
qbtn.clicked.connect(QCoreApplication.instance().quit)
303
325
```
304
- 事件传递系统在PyQt5内建的single和slot机制里面。点击按钮之后,信号会被捕捉并给出既定的反应。QCoreApplication包含了事件的主循环 ,它能添加和删除所有的事件,instance()创建了一个它的实例。QCoreApplication是在QApplication里创建的 。 点击事件和能终止进程并退出应用的quit函数绑定在了一起。在发送者和接受者之间建立了通讯,发送者就是按钮,接受者就是应用对象。
326
+ 事件传递系统在PyQt5内建的single和slot机制里面。点击按钮之后,信号会被捕捉并给出既定的反应。` QCoreApplication ` 包含了事件的主循环 ,它能添加和删除所有的事件,` instance() ` 创建了一个它的实例。` QCoreApplication ` 是在 ` QApplication ` 里创建的 。 点击事件和能终止进程并退出应用的quit函数绑定在了一起。在发送者和接受者之间建立了通讯,发送者就是按钮,接受者就是应用对象。
305
327
306
328
程序预览:
307
329
@@ -310,7 +332,8 @@ qbtn.clicked.connect(QCoreApplication.instance().quit)
310
332
## 例5,消息盒子
311
333
312
334
默认情况下,我们点击标题栏的×按钮,QWidget就会关闭。但是有时候,我们修改默认行为。比如,如果我们打开的是一个文本编辑器,并且做了一些修改,我们就会想在关闭按钮的时候让用户进一步确认操作。
313
- ```
335
+
336
+ ``` python
314
337
# !/usr/bin/python3
315
338
# -*- coding: utf-8 -*-
316
339
@@ -321,9 +344,9 @@ This program shows a confirmation
321
344
message box when we click on the close
322
345
button of the application window.
323
346
324
- author : Jan Bodnar
325
- website : zetcode.com
326
- last edited: January 2015
347
+ Author : Jan Bodnar
348
+ Website : zetcode.com
349
+ Last edited: August 2017
327
350
"""
328
351
329
352
import sys
@@ -363,13 +386,15 @@ if __name__ == '__main__':
363
386
ex = Example()
364
387
sys.exit(app.exec_())
365
388
```
366
- 如果关闭QWidget,就会产生一个QCloseEvent。改变空间的默认行为,就是替换掉默认的事件处理。
389
+ 如果关闭QWidget,就会产生一个QCloseEvent。改变控件的默认行为,就是替换掉默认的事件处理。
390
+
367
391
```
368
392
reply = QMessageBox.question(self, 'Message',
369
393
"Are you sure to quit?", QMessageBox.Yes |
370
394
QMessageBox.No, QMessageBox.No)
371
395
```
372
396
我们创建了一个消息框,上面有俩按钮:Yes和No.第一个字符串显示在消息框的标题栏,第二个字符串显示在对话框,第三个参数是消息框的俩按钮,最后一个参数是默认按钮,这个按钮是默认选中的。返回值在变量` reply ` 里。
397
+
373
398
```
374
399
if reply == QtGui.QMessageBox.Yes:
375
400
event.accept()
@@ -384,7 +409,7 @@ else:
384
409
385
410
## 例6,窗口居中
386
411
387
- ```
412
+ ``` python
388
413
# !/usr/bin/python3
389
414
# -*- coding: utf-8 -*-
390
415
@@ -394,9 +419,9 @@ ZetCode PyQt5 tutorial
394
419
This program centers a window
395
420
on the screen.
396
421
397
- author : Jan Bodnar
398
- website : zetcode.com
399
- last edited: January 2015
422
+ Author : Jan Bodnar
423
+ Website : zetcode.com
424
+ Last edited: August 2017
400
425
"""
401
426
402
427
import sys
@@ -434,30 +459,34 @@ if __name__ == '__main__':
434
459
ex = Example()
435
460
sys.exit(app.exec_())
436
461
```
437
- QtGui.QDesktopWidget类提供了用户的桌面信息,其中就有屏幕的大小 。
462
+ ` QtGui.QDesktopWidget ` 提供了用户的桌面信息,包括屏幕的大小 。
438
463
439
464
```
440
465
self.center()
441
466
```
442
467
443
468
这个方法是调用我们下面写的,实现对话框居中的方法。
469
+
444
470
```
445
471
qr = self.frameGeometry()
446
472
```
447
- 这样我们得到了主窗口的大小。
473
+ 得到了主窗口的大小。
474
+
448
475
```
449
476
cp = QDesktopWidget().availableGeometry().center()
450
477
```
451
- 获取到显示器的分辨率,然后得到了中间点的位置。
478
+ 获取显示器的分辨率,然后得到中间点的位置。
479
+
452
480
```
453
481
qr.moveCenter(cp)
454
482
```
455
483
然后把自己窗口的中心点放置到qr的中心点。
484
+
456
485
```
457
486
self.move(qr.topLeft())
458
487
```
459
- 然后把窗口的坐上角移动到qr的矩形的左上角上,这样就居中了我们自己的窗口 。
488
+ 然后把窗口的坐上角的坐标设置为qr的矩形左上角的坐标,这样就把窗口居中了 。
460
489
461
- - [ ] TODO:这个翻译的好扯
490
+ 程序预览:
462
491
463
- **这个例子没有程序预览**
492
+ ![ center ] ( ./images/1-center.png )
0 commit comments