【转】PyQt4 精彩实例分析 实例 12 基本布局管理
本实例利用基本布局管理(QHBoxLayout,QVBoxLayout,QGridLayout)实现一个类似 QQ 的用户资料修改
页面。实现效果图如下图所示。

Qt 提供的布局类以及它们之间的继承关系如下图所示。

常用到的布局类有 QHBoxLayout,QVBoxLayout,QGridLayout 3 种,分别水平排列布局,垂直排列布局
和表格排列布局。Qt3 中的 QHBox 和 QVBox 到 Qt4 以后被废弃。布局中最常用的方法有 addWidget()和
addLayout(),addWidget()方法用于在布局中插入控件,addLayout()用于在布局中插入子布局。
下面通过实例的实现过程了解布局管理的使用方法。首先通过一个示意图了解此对话框的布局结构,如下图所
示。

从上图中可知,本实例共用到 4 个布局管理器,分别是 LeftLayout,RightLayout,BottomLayout 和
MainLayout。
下面是具体的实现。
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 from PyQt4.QtGui import * 5 from PyQt4.QtCore import * 6 import sys 7 8 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) 9 10 class LayoutDialog(QDialog): 11 def __init__(self, parent=None): 12 super(LayoutDialog, self).__init__(parent) 13 self.setWindowTitle("User Info") 14 self.CreateControls() 15 self.Layout() 16 self.ConnectSignalSlot() 17 18 def CreateControls(self): 19 self.label_0 = QLabel(self.tr("NickName:")) 20 self.label_1 = QLabel(self.tr("UserName:")) 21 self.label_2 = QLabel(self.tr("Sex:")) 22 self.label_3 = QLabel(self.tr("Department:")) 23 self.label_4 = QLabel(self.tr("Age:")) 24 self.label_5 = QLabel(self.tr("Remark:")) 25 self.label_5.setFrameStyle(QFrame.Panel|QFrame.Sunken) 26 self.label_6 = QLabel(self.tr("Icon:")) 27 self.label_7 = QLabel(self.tr("Personal Description:")) 28 29 self.label_icon = QLabel() 30 icon = QPixmap("image/2048.ico") 31 self.label_icon.setPixmap(icon) 32 self.label_icon.resize(icon.width(), icon.height()) 33 34 self.btn_ok = QPushButton(self.tr("OK")) 35 self.btn_cancel = QPushButton(self.tr("Cancel")) 36 self.btn_change = QPushButton(self.tr("Change")) 37 38 self.lineEdit_nickName = QLineEdit() 39 self.lineEdit_userName = QLineEdit() 40 self.lineEdit_age = QLineEdit() 41 self.comboBox_sex = QComboBox() 42 self.comboBox_sex.insertItem(0, self.tr("M")) 43 self.comboBox_sex.insertItem(1, self.tr("F")) 44 45 self.textEdit_department = QTextEdit() 46 self.textEdit_desc = QTextEdit() 47 48 def Layout(self): 49 self.LeftLayout() 50 self.RightLayout() 51 self.BottonLayout() 52 53 mainLayout = QGridLayout(self) 54 mainLayout.setMargin(10) 55 mainLayout.setSpacing(10) 56 mainLayout.addLayout(self.leftLayout, 0, 0) 57 mainLayout.addLayout(self.rightLayout, 0, 1) 58 mainLayout.addLayout(self.bottomLayout, 1, 0, 1, 2) 59 mainLayout.setSizeConstraint(QLayout.SetFixedSize) 60 61 def LeftLayout(self): 62 self.leftLayout = QGridLayout() 63 self.leftLayout.addWidget(self.label_0, 0, 0) 64 self.leftLayout.addWidget(self.label_1, 1, 0) 65 self.leftLayout.addWidget(self.label_2, 2, 0) 66 self.leftLayout.addWidget(self.label_3, 3, 0) 67 self.leftLayout.addWidget(self.label_4, 4, 0) 68 self.leftLayout.addWidget(self.label_5, 5, 0, 1, 2) 69 self.leftLayout.addWidget(self.lineEdit_nickName, 0, 1) 70 self.leftLayout.addWidget(self.lineEdit_userName, 1, 1) 71 self.leftLayout.addWidget(self.comboBox_sex, 2, 1) 72 self.leftLayout.addWidget(self.textEdit_department, 3, 1) 73 self.leftLayout.addWidget(self.lineEdit_age, 4, 1) 74 self.leftLayout.setColumnStretch(0, 1) 75 self.leftLayout.setColumnStretch(1, 3) 76 77 def RightLayout(self): 78 hLayout = QHBoxLayout() 79 hLayout.setSpacing(20) 80 hLayout.addWidget(self.label_6) 81 hLayout.addWidget(self.label_icon) 82 hLayout.addWidget(self.btn_change) 83 84 self.rightLayout = QVBoxLayout() 85 self.rightLayout.setMargin(10) 86 self.rightLayout.addLayout(hLayout) 87 self.rightLayout.addWidget(self.label_7) 88 self.rightLayout.addWidget(self.textEdit_desc) 89 90 def BottonLayout(self): 91 self.bottomLayout = QHBoxLayout() 92 self.bottomLayout.addStretch() 93 self.bottomLayout.addWidget(self.btn_ok) 94 self.bottomLayout.addWidget(self.btn_cancel) 95 96 def ConnectSignalSlot(self): 97 pass 98 99 def main(): 100 app = QApplication(sys.argv) 101 dialog = LayoutDialog() 102 dialog.show() 103 app.exec_() 104 105 if __name__ == '__main__': 106 main()
CreateControls: 创建所有用到的控件
Layout: 布局管理
LeftLayout: 对照上面图片布局
RightLayout: 对照上面图片布局
BottomLayout: 对照上面图片布局
setFrameStyle()是 QFrame 的方法,
参数以或的方式设定控件的面板风格,由形式(QFrame.Shape)和阴影(QFrame.Shadow)两项配合设定。
其中,形状有 NoFrame,Panel,Box,HLine,VLine 以及 WinPanel 6 种,阴影有 Plain,Raised 和
Sunken 3 种,具体的效果读者可自行搭配试验。
QHBoxLayout 默认采取自左向右的方式顺序排列插入的控件,也可通过调用 setDirection()方法设
定排列的顺序,例如:
hLayout.setDirection(QBoxLayout.RightToLeft)
-- addWidget(...)
QGridLayout.addWidget(QWidget)
QGridLayout.addWidget(QWidget, int, int, Qt.Alignment alignment=0)
QGridLayout.addWidget(QWidget, int, int, int, int, Qt.Alignment alignment=0)
最后一个参数含义: QGridLayout.addWidget(窗体, 起始行, 起始列, 占用行, 占用列, 对齐方式)
setMargin(): 设定对话框边距
setSpacing(): 设定控件之间的间距
mainLayout.setSizeConstraint(QLayout.SetFixedSize): 设定对话框的控件总是最优化显示,并且用户无法改变对话框的大小,所谓最优化显示,即控
件都按其 sizeHint()的大小显示

浙公网安备 33010602011771号