接下来这个专题介绍PyQt的一些内容

教程翻译自:

[https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm](https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm)

由于本人也是学习状态,翻译可能不准确,请及时指出,我会很快修正

一些关键字会直接使用英文

目前该专题为纯理论,实际操作在完成后有演示

PyQt版本: PyQt4

[TOC]
##1. 绝对位置

我们可以使用setGeometry() 方法设置widget在窗体上的位置和大小

```
import sys
from PyQt4 import QtGui

def window():
   app = QtGui.QApplication(sys.argv)
   w = QtGui.QWidget()
	
   b = QtGui.QPushButton(w)
   b.setText("Hello World!")
   b.move(50,20)
	
   w.setGeometry(10,10,300,200)
   w.setWindowTitle(“PyQt”)
   w.show()
   sys.exit(app.exec_())
	
if __name__ == '__main__':
   window()
```

上面例子中

最外层Widget 300*200 像素大小 在显示器中位置为(10,10)

QPushButton 放在靠窗体右边50像素,窗体下面20像素的位置

**绝对位置的劣处**

1. 当窗体改变大小时不会自动变化
2. 不同设备不同分辨率上显示不一致
3. 更改布局可能需要重新设计代码


[image:140 size:orig]



## 2. 自动布局

PyQt 提供一种方便的自动的布局方式,他可以

1. 窗体上的widget会随着窗体的大小改变而自动改变
2. 确保不同设备不同分辨率有同意的显示
3. 更改某个widget不用重新设计代码


如下为一些常用的布局方式


###2.1 QBoxLayout

将widget 垂直或水平排列在一起

该布局通过如下2个类创建

- QVBoxLayout   垂直排列
- QHBoxLayout  水平排列

他们有如下方法:

**addWidget()**

增加一个widget到BoxLayout

**addStretch()**

增加一个空的空间到BoxLayout

**addLayout()**

增加另一个嵌套的BoxLayout

**应用举例**

```
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QWidget()

   b1 = QPushButton("Button1")
   b2 = QPushButton("Button2")
	
   vbox = QVBoxLayout()
   vbox.addWidget(b1)
   vbox.addStretch()
   vbox.addWidget(b2)
   hbox = QHBoxLayout()
	
   b3 = QPushButton("Button3")
   b4 = QPushButton("Button4")
   hbox.addWidget(b3)
   hbox.addStretch()
   hbox.addWidget(b4)

   vbox.addStretch()
   vbox.addLayout(hbox)
   win.setLayout(vbox)

   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   window()
```


下面的例子创建一个QVBoxLayout 和一个QHBoxLayout

各放置2个button
之后将hbox嵌套至vbox


[image:141 size:orig]

更多例子请参考

[https://www.tutorialspoint.com/pyqt/pyqt_qboxlayout_class.htm](https://www.tutorialspoint.com/pyqt/pyqt_qboxlayout_class.htm)

###2.2  QGridLayout

网格布局方式将widget按照表格(行列)的方式排列起来

我们可以将widget 放在制定的行和列中

可选的 我们还可以扩展行和列的大小,这样可使其相对于其他的widget更高和宽

它有如下方法

**addWidget(QWidget, int r, int c)**

在指定的行列增加widget

**addWidget(QWidget, int r, int c, int rowspan, int columnspan)**

在指定的行列增加widget并设定大小

**addLayout(QLayout, int r, int c)**

使用addLayout可以将其他layout插入到指定行列

**应用举例**

```
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QWidget()
   grid = QGridLayout()
	
   for i in range(1,5):
      for j in range(1,5):
         grid.addWidget(QPushButton("B"+str(i)+str(j)),i,j)
			
   win.setLayout(grid)
   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   window()
```

上面的程序首先新建一个QGridLayout 

之后使用循环的形式增加QPushButton

[image:142 size:orig]


###2.3 QFormLayout

该布局可以让我们很方便的创建一个表单布局

即只有两列的网格布局

第一列为label 第二列为输入框

它有如下3个方法

**addRow(QLabel, QWidget)**

增加包含label和input的一行

**addRow(QLabel, QLayout)**

在第二列增加一个Layout

**addRow(QWidget)**

增加一个widget,该widget扩展在两列

**应用举例**

代码很简单,看下就行

```
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QWidget()

   l1 = QLabel("Name")
   nm = QLineEdit()

   l2 = QLabel("Address")
   add1 = QLineEdit()
   add2 = QLineEdit()
   fbox = QFormLayout()
   fbox.addRow(l1,nm)
   vbox = QVBoxLayout()

   vbox.addWidget(add1)
   vbox.addWidget(add2)
   fbox.addRow(l2,vbox)
   hbox = QHBoxLayout()

   r1 = QRadioButton("Male")
   r2 = QRadioButton("Female")
   hbox.addWidget(r1)
   hbox.addWidget(r2)
   hbox.addStretch()
   fbox.addRow(QLabel("sex"),hbox)
   fbox.addRow(QPushButton("Submit"),QPushButton("Cancel"))

   win.setLayout(fbox)
   
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   window()
```

[image:143 size:orig]