@@ -37,39 +37,56 @@ if __name__ == '__main__':
37
37
38
38
sys.exit(app.exec_())
39
39
```
40
+
40
41
运行上面的代码,能展示出一个小窗口。
42
+
41
43
```
42
44
import sys
43
45
from PyQt5.QtWidgets import QApplication, QWidget
44
46
```
47
+
45
48
这里引入了PyQt5.QtWidgets模块,这个模块包含了基本的组件。
49
+
46
50
```
47
51
app = QApplication(sys.argv)
48
52
```
53
+
49
54
每个PyQt5应用都必须创建一个应用对象。sys.argv是一组命令行参数的列表。Python可以在shell里运行,这个参数提供对脚本控制的功能。
55
+
50
56
```
51
57
w = QWidget()
52
58
```
59
+
53
60
QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器。默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)。
61
+
54
62
```
55
63
w.resize(250, 150)
56
64
```
65
+
57
66
resize()方法能改变控件的大小,这里的意思是窗口宽250px,高150px。
67
+
58
68
```
59
69
w.move(300, 300)
60
70
```
71
+
61
72
move()是修改控件位置的的方法。它把控件放置到屏幕坐标的(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角。
73
+
62
74
```
63
75
w.setWindowTitle('Simple')
64
76
```
77
+
65
78
我们给这个窗口添加了一个标题,标题在标题栏展示(虽然这看起来是一句废话,但是后面还有各种栏,还是要注意一下,多了就蒙了)。
79
+
66
80
```
67
81
w.show()
68
82
```
83
+
69
84
show()能让控件在桌面上显示出来。控件在内存里创建,之后才能在显示器上显示出来。
85
+
70
86
```
71
87
sys.exit(app.exec_())
72
88
```
89
+
73
90
最后,我们进入了应用的主循环中,事件处理器这个时候开始工作。主循环从窗口上接收事件,并把事件传入到派发到应用控件里。当调用` exit() ` 方法或直接销毁主控件时,主循环就会结束。` sys.exit() ` 方法能确保主循环安全退出。外部环境能通知主控件怎么结束。
74
91
75
92
` exec_() ` 之所以有个下划线,是因为` exec ` 是一个Python的关键字。
@@ -155,7 +172,6 @@ self.setWindowIcon(QIcon('web.png'))
155
172
156
173
上面的三个方法都继承自` QWidget ` 类。` setGeometry() ` 有两个作用:把窗口放到屏幕上并且设置窗口大小。参数分别代表屏幕坐标的x、y和窗口大小的宽、高。也就是说这个方法是` resize() ` 和` move() ` 的合体。最后一个方法是添加了图标。先创建一个QIcon对象,然后接受一个路径作为参数显示图标。
157
174
158
-
159
175
```
160
176
if __name__ == '__main__':
161
177
@@ -170,7 +186,6 @@ if __name__ == '__main__':
170
186
171
187
![ icon] ( ./images/1-icon.png )
172
188
173
-
174
189
## 例3,提示框
175
190
176
191
``` python
@@ -224,42 +239,49 @@ if __name__ == '__main__':
224
239
ex = Example()
225
240
sys.exit(app.exec_())
226
241
```
242
+
227
243
在这个例子中,我们为应用创建了一个提示框。
228
244
229
245
```
230
246
QToolTip.setFont(QFont('SansSerif', 10))
231
247
```
248
+
232
249
这个静态方法设置了提示框的字体,我们使用了10px的SansSerif字体。
233
250
234
251
```
235
252
self.setToolTip('This is a <b>QWidget</b> widget')
236
253
```
254
+
237
255
调用` setTooltip() ` 创建提示框可以使用富文本格式的内容。
238
256
239
257
```
240
258
btn = QPushButton('Button', self)
241
259
btn.setToolTip('This is a <b>QPushButton</b> widget')
242
260
```
261
+
243
262
创建一个按钮,并且为按钮添加了一个提示框。
244
263
245
264
```
246
265
btn.resize(btn.sizeHint())
247
266
btn.move(50, 50)
248
267
```
268
+
249
269
调整按钮大小,并让按钮在屏幕上显示出来,` sizeHint() ` 方法提供了一个默认的按钮大小。
250
270
251
271
程序预览:
252
272
253
273
![ tooltip] ( ./images/1-tooltips.png )
254
274
255
275
## 例4,关闭窗口
276
+
256
277
关闭一个窗口最直观的方式就是点击标题栏的那个叉,这个例子里,我们展示的是如何用程序关闭一个窗口。这里我们将接触到一点single和slots的知识。
257
278
258
279
本例使用的是QPushButton组件类。
259
280
260
281
```
261
282
QPushButton(string text, QWidget parent = None)
262
283
```
284
+
263
285
` text ` 参数是想要显示的按钮名称,` parent ` 参数是放在按钮上的组件,在我们的 例子里,这个参数是` QWidget ` 。应用中的组件都是一层一层(继承而来的?)的,在这个层里,大部分的组件都有自己的父级,没有父级的组件,是顶级的窗口。
264
286
265
287
``` python
@@ -309,21 +331,25 @@ if __name__ == '__main__':
309
331
ex = Example()
310
332
sys.exit(app.exec_())
311
333
```
334
+
312
335
这里创建了一个点击之后就退出窗口的按钮。
313
336
314
337
```
315
338
from PyQt5.QtCore import QCoreApplication
316
339
```
340
+
317
341
程序需要` QtCore ` 对象。
318
342
319
343
```
320
344
qbtn = QPushButton('Quit', self)
321
345
```
346
+
322
347
创建一个继承自` QPushButton ` 的按钮。第一个参数是按钮的文本,第二个参数是按钮的父级组件,这个例子中,父级组件就是我们创建的继承自` Qwidget ` 的` Example ` 类。
323
348
324
349
```
325
350
qbtn.clicked.connect(QCoreApplication.instance().quit)
326
351
```
352
+
327
353
事件传递系统在PyQt5内建的single和slot机制里面。点击按钮之后,信号会被捕捉并给出既定的反应。` QCoreApplication ` 包含了事件的主循环,它能添加和删除所有的事件,` instance() ` 创建了一个它的实例。` QCoreApplication ` 是在` QApplication ` 里创建的。 点击事件和能终止进程并退出应用的quit函数绑定在了一起。在发送者和接受者之间建立了通讯,发送者就是按钮,接受者就是应用对象。
328
354
329
355
程序预览:
@@ -387,21 +413,24 @@ if __name__ == '__main__':
387
413
ex = Example()
388
414
sys.exit(app.exec_())
389
415
```
390
- 如果关闭QWidget,就会产生一个QCloseEvent。改变控件的默认行为,就是替换掉默认的事件处理。
416
+
417
+ 如果关闭QWidget,就会产生一个QCloseEvent,并且把它传入到closeEvent函数的event参数中。改变控件的默认行为,就是替换掉默认的事件处理。
391
418
392
419
```
393
420
reply = QMessageBox.question(self, 'Message',
394
421
"Are you sure to quit?", QMessageBox.Yes |
395
422
QMessageBox.No, QMessageBox.No)
396
423
```
424
+
397
425
我们创建了一个消息框,上面有俩按钮:Yes和No.第一个字符串显示在消息框的标题栏,第二个字符串显示在对话框,第三个参数是消息框的俩按钮,最后一个参数是默认按钮,这个按钮是默认选中的。返回值在变量` reply ` 里。
398
426
399
427
```
400
- if reply == QtGui. QMessageBox.Yes:
428
+ if reply == QMessageBox.Yes:
401
429
event.accept()
402
430
else:
403
431
event.ignore()
404
432
```
433
+
405
434
这里判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否者就忽略关闭事件。
406
435
407
436
程序预览:
@@ -460,6 +489,7 @@ if __name__ == '__main__':
460
489
ex = Example()
461
490
sys.exit(app.exec_())
462
491
```
492
+
463
493
` QtGui.QDesktopWidget ` 提供了用户的桌面信息,包括屏幕的大小。
464
494
465
495
```
@@ -471,22 +501,28 @@ self.center()
471
501
```
472
502
qr = self.frameGeometry()
473
503
```
474
- 得到了主窗口的大小。
504
+
505
+ 获得主窗口所在的框架。
475
506
476
507
```
477
508
cp = QDesktopWidget().availableGeometry().center()
478
509
```
479
- 获取显示器的分辨率,然后得到中间点的位置。
510
+
511
+ 获取显示器的分辨率,然后得到屏幕中间点的位置。
480
512
481
513
```
482
514
qr.moveCenter(cp)
483
515
```
484
- 然后把自己窗口的中心点放置到qr的中心点。
516
+
517
+ 然后把主窗口框架的中心点放置到屏幕的中心位置。
485
518
486
519
```
487
520
self.move(qr.topLeft())
488
521
```
489
- 然后把窗口的坐上角的坐标设置为qr的矩形左上角的坐标,这样就把窗口居中了。
522
+
523
+ 然后通过move函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了。
524
+
525
+ * 总结:窗口位于一个框架中,先将框架移动到屏幕中央,再把窗口移动到框架上。*
490
526
491
527
程序预览:
492
528
0 commit comments