接下来这个专题介绍PyQt的一些内容
教程翻译自:
https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm
由于本人也是学习状态,翻译可能不准确,请及时指出,我会很快修正
一些关键字会直接使用英文
目前该专题为纯理论,实际操作在完成后有演示
我们可以使用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像素的位置
绝对位置的劣处
PyQt 提供一种方便的自动的布局方式,他可以
如下为一些常用的布局方式
将widget 垂直或水平排列在一起
该布局通过如下2个类创建
他们有如下方法:
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
更多例子请参考
https://www.tutorialspoint.com/pyqt/pyqt_qboxlayout_class.htm
网格布局方式将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
该布局可以让我们很方便的创建一个表单布局
即只有两列的网格布局
第一列为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()