【转】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()的大小显示

posted @ 2014-11-18 10:48  jakey.chen  阅读(683)  评论(0)    收藏  举报