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

教程翻译自:

https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm

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

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

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

PyQt版本: PyQt4

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. 更改布局可能需要重新设计代码
1.png

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

2.png

更多例子请参考

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

3.png

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()
4.png