Skip to content

Commit 5f53332

Browse files
author
maicss
committed
Updates 布局管理.md
Auto commit by GitBook Editor
1 parent 096a866 commit 5f53332

File tree

1 file changed

+69
-51
lines changed

1 file changed

+69
-51
lines changed

布局管理.md

Lines changed: 69 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
在一个GUI程序里,布局是一个很重要的方面。布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类
44

55
## 绝对定位
6+
67
每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。但是这也有局限性:
78

8-
- 元素不会随着我们更改窗口的位置和大小而变化。
9-
- 不能适用于不同的平台和不同分辨率的显示器
10-
- 更改应用字体大小会破坏布局
11-
- 如果我们决定重构这个应用,需要全部计算一下每个元素的位置和大小
9+
* 元素不会随着我们更改窗口的位置和大小而变化。
10+
* 不能适用于不同的平台和不同分辨率的显示器
11+
* 更改应用字体大小会破坏布局
12+
* 如果我们决定重构这个应用,需要全部计算一下每个元素的位置和大小
1213

1314
下面这个就是绝对定位的应用
1415

@@ -31,48 +32,51 @@ import sys
3132
from PyQt5.QtWidgets import QWidget, QLabel, QApplication
3233

3334
class Example(QWidget):
34-
35+
3536
def __init__(self):
3637
super().__init__()
37-
38+
3839
self.initUI()
39-
40-
40+
41+
4142
def initUI(self):
42-
43+
4344
lbl1 = QLabel('Zetcode', self)
4445
lbl1.move(15, 10)
4546

4647
lbl2 = QLabel('tutorials', self)
4748
lbl2.move(35, 40)
48-
49+
4950
lbl3 = QLabel('for programmers', self)
5051
lbl3.move(55, 70)
51-
52+
5253
self.setGeometry(300, 300, 250, 150)
5354
self.setWindowTitle('Absolute')
5455
self.show()
55-
56-
56+
57+
5758
if __name__ == '__main__':
58-
59+
5960
app = QApplication(sys.argv)
6061
ex = Example()
6162
sys.exit(app.exec_())
6263
```
63-
我们使用move()方法定位了每一个元素,使用x、y坐标。x、y坐标的原点是程序的左上角。
64+
65+
我们使用move\(\)方法定位了每一个元素,使用x、y坐标。x、y坐标的原点是程序的左上角。
6466

6567
```
6668
lbl1 = QLabel('Zetcode', self)
6769
lbl1.move(15, 10)
6870
```
69-
这个元素的左上角就在这个程序的左上角开始的(15, 10)的位置。
71+
72+
这个元素的左上角就在这个程序的左上角开始的\(15, 10\)的位置。
7073

7174
程序展示:
7275

7376
![Absolute positioning](./images/3-absolute.png)
7477

7578
## 盒布局
79+
7680
使用盒布局能让程序具有更强的适应性。这个才是布局一个应用的更合适的方式。`QHBoxLayout``QVBoxLayout`是基本的布局类,分别是水平布局和垂直布局。
7781

7882
如果我们需要把两个按钮放在程序的右下角,创建这样的布局,我们只需要一个水平布局加一个垂直布局的盒子就可以了。再用弹性布局增加一点间隙。
@@ -99,15 +103,15 @@ from PyQt5.QtWidgets import (QWidget, QPushButton,
99103

100104

101105
class Example(QWidget):
102-
106+
103107
def __init__(self):
104108
super().__init__()
105-
109+
106110
self.initUI()
107-
108-
111+
112+
109113
def initUI(self):
110-
114+
111115
okButton = QPushButton("OK")
112116
cancelButton = QPushButton("Cancel")
113117

@@ -119,21 +123,22 @@ class Example(QWidget):
119123
vbox = QVBoxLayout()
120124
vbox.addStretch(1)
121125
vbox.addLayout(hbox)
122-
126+
123127
self.setLayout(vbox)
124-
128+
125129
self.setGeometry(300, 300, 300, 150)
126130
self.setWindowTitle('Buttons')
127131
self.show()
128-
129-
132+
133+
130134
if __name__ == '__main__':
131-
135+
132136
app = QApplication(sys.argv)
133137
ex = Example()
134138
sys.exit(app.exec_())
135139
```
136-
上面的例子完成了在应用的右下角放了两个按钮的需求。当改变窗口大小的时候,它们能依然保持在相对的位置。我们同时使用了`HBoxLayout``QVBoxLayout`
140+
141+
上面的例子完成了在应用的右下角放了两个按钮的需求。当改变窗口大小的时候,它们能依然保持在相对的位置。我们同时使用了`QHBoxLayout``QVBoxLayout`
137142

138143
```
139144
okButton = QPushButton("OK")
@@ -148,18 +153,21 @@ hbox.addStretch(1)
148153
hbox.addWidget(okButton)
149154
hbox.addWidget(cancelButton)
150155
```
156+
151157
创建一个水平布局,增加两个按钮和弹性空间。stretch函数在两个按钮前面增加了一些弹性空间。下一步我们把这些元素放在应用的右下角。
152158

153159
```
154160
vbox = QVBoxLayout()
155161
vbox.addStretch(1)
156162
vbox.addLayout(hbox)
157163
```
164+
158165
为了布局需要,我们把这个水平布局放到了一个垂直布局盒里面。弹性元素会把所有的元素一起都放置在应用的右下角。
159166

160167
```
161168
self.setLayout(vbox)
162169
```
170+
163171
最后,我们就得到了我们想要的布局。
164172

165173
程序预览:
@@ -191,50 +199,52 @@ from PyQt5.QtWidgets import (QWidget, QGridLayout,
191199

192200

193201
class Example(QWidget):
194-
202+
195203
def __init__(self):
196204
super().__init__()
197-
205+
198206
self.initUI()
199-
200-
207+
208+
201209
def initUI(self):
202-
210+
203211
grid = QGridLayout()
204212
self.setLayout(grid)
205-
213+
206214
names = ['Cls', 'Bck', '', 'Close',
207215
'7', '8', '9', '/',
208216
'4', '5', '6', '*',
209217
'1', '2', '3', '-',
210218
'0', '.', '=', '+']
211-
219+
212220
positions = [(i,j) for i in range(5) for j in range(4)]
213-
221+
214222
for position, name in zip(positions, names):
215-
223+
216224
if name == '':
217225
continue
218226
button = QPushButton(name)
219227
grid.addWidget(button, *position)
220-
228+
221229
self.move(300, 150)
222230
self.setWindowTitle('Calculator')
223231
self.show()
224-
225-
232+
233+
226234
if __name__ == '__main__':
227-
235+
228236
app = QApplication(sys.argv)
229237
ex = Example()
230238
sys.exit(app.exec_())
231239
```
240+
232241
这个例子里,我们创建了栅格化的按钮。
233242

234243
```
235244
grid = QGridLayout()
236245
self.setLayout(grid)
237246
```
247+
238248
创建一个QGridLayout实例,并把它放到程序窗口里。
239249

240250
```
@@ -244,28 +254,32 @@ names = ['Cls', 'Bck', '', 'Close',
244254
'1', '2', '3', '-',
245255
'0', '.', '=', '+']
246256
```
257+
247258
这是我们将要使用的按钮的名称。
248259

249260
```
250261
positions = [(i,j) for i in range(5) for j in range(4)]
251262
```
263+
252264
创建按钮位置列表。
253265

254266
```
255267
for position, name in zip(positions, names):
256-
268+
257269
if name == '':
258270
continue
259271
button = QPushButton(name)
260272
grid.addWidget(button, *position)
261273
```
274+
262275
创建按钮,并使用`addWidget()`方法把按钮放到布局里面。
263276

264277
程序预览:
265278

266279
![Calculator skeleton](./images/3-calculator.png)
267280

268281
## 制作提交反馈信息的布局
282+
269283
组件能跨列和跨行展示,这个例子里,我们就试试这个功能。
270284

271285
```python
@@ -289,15 +303,15 @@ from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,
289303
QTextEdit, QGridLayout, QApplication)
290304

291305
class Example(QWidget):
292-
306+
293307
def __init__(self):
294308
super().__init__()
295-
309+
296310
self.initUI()
297-
298-
311+
312+
299313
def initUI(self):
300-
314+
301315
title = QLabel('Title')
302316
author = QLabel('Author')
303317
review = QLabel('Review')
@@ -317,33 +331,37 @@ class Example(QWidget):
317331

318332
grid.addWidget(review, 3, 0)
319333
grid.addWidget(reviewEdit, 3, 1, 5, 1)
320-
334+
321335
self.setLayout(grid)
322-
336+
323337
self.setGeometry(300, 300, 350, 300)
324338
self.setWindowTitle('Review')
325339
self.show()
326-
327-
340+
341+
328342
if __name__ == '__main__':
329-
343+
330344
app = QApplication(sys.argv)
331345
ex = Example()
332346
sys.exit(app.exec_())
333347
```
348+
334349
我们创建了一个有三个标签的窗口。两个行编辑和一个文版编辑,这是用`QGridLayout`模块搞定的。
335350

336351
```
337352
grid = QGridLayout()
338353
grid.setSpacing(10)
339354
```
355+
340356
创建标签之间的空间。
341357

342358
```
343359
grid.addWidget(reviewEdit, 3, 1, 5, 1)
344360
```
361+
345362
我们可以指定组件的跨行和跨列的大小。这里我们指定这个元素跨5行显示。
346363

347364
程序预览:
348365

349366
![review example](./images/3-review.png)
367+

0 commit comments

Comments
 (0)