PyQt4 精彩实例分析* 实例12 基本布局管理
来源:互联网 发布:淘宝无忧退货 编辑:程序博客网 时间:2024/05/01 00:42
本实例利用基本布局管理(QHBoxLayout,QVBoxLayout,QGridLayout)实现一个类似QQ的用户资料修改页面。实现效果图如下图所示。
Qt提供的布局类以及它们之间的继承关系如下图所示。
常用到的布局类有QHBoxLayout,QVBoxLayout,QGridLayout 3种,分别水平排列布局,垂直排列布局和表格排列布局。Qt3中的QHBox和QVBox到Qt4以后被废弃。布局中最常用的方法有addWidget()和addLayout(),addWidget()方法用于在布局中插入控件,addLayout()用于在布局中插入子布局。
下面通过实例的实现过程了解布局管理的使用方法。首先通过一个示意图了解此对话框的布局结构,如下图所示。
从上图中可知,本实例共用到4个布局管理器,分别是LeftLayout,RightLayout,BottomLayout和MainLayout。
下面是具体的实现。
# -*- coding: utf-8 -*-from PyQt4.QtGui import *from PyQt4.QtCore import *import sysQTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))class LayoutDialog(QDialog): def __init__(self,parent=None): super(LayoutDialog,self).__init__(parent) self.setWindowTitle(self.tr("用户信息")) label1=QLabel(self.tr("用户名:")) label2=QLabel(self.tr("姓名:")) label3=QLabel(self.tr("性别:")) label4=QLabel(self.tr("部门:")) label5=QLabel(self.tr("年龄:")) otherLabel=QLabel(self.tr("备注:")) otherLabel.setFrameStyle(QFrame.Panel|QFrame.Sunken) userLineEdit=QLineEdit() nameLineEdit=QLineEdit() sexComboBox=QComboBox() sexComboBox.insertItem(0,self.tr("男")) sexComboBox.insertItem(1,self.tr("女")) departmentTextEdit=QTextEdit() ageLineEdit=QLineEdit() labelCol=0 contentCol=1 leftLayout=QGridLayout() leftLayout.addWidget(label1,0,labelCol) leftLayout.addWidget(userLineEdit,0,contentCol) leftLayout.addWidget(label2,1,labelCol) leftLayout.addWidget(nameLineEdit,1,contentCol) leftLayout.addWidget(label3,2,labelCol) leftLayout.addWidget(sexComboBox,2,contentCol) leftLayout.addWidget(label4,3,labelCol) leftLayout.addWidget(departmentTextEdit,3,contentCol) leftLayout.addWidget(label5,4,labelCol) leftLayout.addWidget(ageLineEdit,4,contentCol) leftLayout.addWidget(otherLabel,5,labelCol,1,2) leftLayout.setColumnStretch(0,1) leftLayout.setColumnStretch(1,3) label6=QLabel(self.tr("头像:")) iconLabel=QLabel() icon=QPixmap("image/2.jpg") iconLabel.setPixmap(icon) iconLabel.resize(icon.width(),icon.height()) iconPushButton=QPushButton(self.tr("改变")) hLayout=QHBoxLayout() hLayout.setSpacing(20) hLayout.addWidget(label6) hLayout.addWidget(iconLabel) hLayout.addWidget(iconPushButton) label7=QLabel(self.tr("个人说明:")) descTextEdit=QTextEdit() rightLayout=QVBoxLayout() rightLayout.setMargin(10) rightLayout.addLayout(hLayout) rightLayout.addWidget(label7) rightLayout.addWidget(descTextEdit) OKPushButton=QPushButton(self.tr("确定")) cancelPushButton=QPushButton(self.tr("取消")) bottomLayout=QHBoxLayout() bottomLayout.addStretch() bottomLayout.addWidget(OKPushButton) bottomLayout.addWidget(cancelPushButton) mainLayout=QGridLayout(self) mainLayout.setMargin(15) mainLayout.setSpacing(10) mainLayout.addLayout(leftLayout,0,0) mainLayout.addLayout(rightLayout,0,1) mainLayout.addLayout(bottomLayout,1,0,1,2) mainLayout.setSizeConstraint(QLayout.SetFixedSize) app=QApplication(sys.argv)dialog=LayoutDialog()dialog.show()app.exec_()
第13-26行定义对话框左侧的控件。其中第19行设置控件的风格,setFrameStyle()是QFrame的方法,参数以或的方式设定控件的面板风格,由形式(QFrame.Shape)和阴影(QFrame.Shadow)两项配合设定。其中,形状有NoFrame,Panel,Box,HLine,VLine以及WinPanel 6种,阴影有Plain,Raised和Sunken 3种,具体的效果读者可自行搭配试验。
在定义代码中,可以不必为各个控件指定父窗口,使用布局管理会自动指定布局管理下的所有控件的父窗口。
第28-44行定义控件布局,实现左部布局。
第28行定义一个QGridLayout对象leftLayout,由于此布局管理器并不是主布局管理器,因此不用指定父窗口,最后由主布局管理器统一指定。
QGridLayout类的addWidget()方法用来向布局中加入需布局的控件,第32-42行调用此方法插入需布局的控件。addWidget()的函数原型如下:
addWidget (self, QWidget)
addWidget (self, QWidget, int, int, Qt.Alignment alignment = 0)
addWidget (self, QWidget, int, int, int, int, Qt.Alignment alignment = 0)
QWidget参数为需插入的控件对象,后面的两个int参数为插入的行和列,再后面两上int参数为跨度的行数和跨度的列数,alignment参数描述各控件的对齐方式。
第41行和42行设定两列分别占用的空间的比例,此处设定两列的空间比为1:3。即使对话框框架大小改变了,两列之间的宽度比依然保持不变。
第46-56行实现对话框右上侧的头像选择区的布局,此处采用一个QHBoxLayout类进行布局管理。QHBoxLayout默认采取自左向右的方式顺序排列插入的控件,也可通过调用setDirection()方法设定排列的顺序,例如:
hLayout.setDirection(QBoxLayout.RightToLeft)
第53行调用QLayout的setSpacing()方法设定各个控件之间的间距为20。
第58-65行代码实现对话框右侧的布局。由一个QVBoxLayout实现布局,QVBoxLayout默认自上而下顺序排列插入的控件或子布局,也可通过setDirection()方法改变排列的顺序。由于右侧上部的头像选择区已使用布局,因此第63行调用addLayout()方法在布局中插入子布局。
第67-72行代码实现对话框下方两个按钮的布局,采用QHBoxLayout实现。
第70行调用addStretch()方法在按钮之前插入一个占位符,使两个按钮能靠右对齐。并且在整个对话框的大小发生改变时,保证按钮的大小不发生变化。合理使用addStretch()能让界面的布局效果增色不少。
最后实现主布局,用一个QGridLayout实现,并在定义主布局时指定父窗口self,也可调用self.setLayout(mainLayout)实现。
第75行设定对话框的边距为15。
第79行插入的子布局占用了两列,使用的函数方法和前面的是一样的,也调用addLayout()方法,只是参数不同,原型如下:
addLayout (self, QLayout, int, int, int, int, Qt.Alignment alignment = 0)
QLayout参数为需插入的控件对象,后面的两个int参数为插入的行和列,再后面两上int参数为跨度的行数和跨度的列数,alignment参数描述各控件的对齐方式。
最后,第80行设定对话框的控件总是最优化显示,并且用户无法改变对话框的大小,所谓最优化显示,即控件都按其sizeHint()的大小显示。
在Qt3的布局中,插入占用多行或多列的方法为addMultiCellWidget()和addMultiCellLayout(),在Qt4中废弃了这两种方法,而是统一成addWidget()和addLayout()两种方法。
转自:http://blog.csdn.net/chumpklutz/article/details/6065860
- PyQt4 精彩实例分析* 实例12 基本布局管理
- *PyQt4 精彩实例分析* 实例17 综合布局实例
- PyQt4 精彩实例分析* 实例22 电子钟
- PyQt4 精彩实例分析* 实例24 基本QMainWindow主窗口程序
- PyQt4 精彩实例分析* 实例1 Hello Kitty!
- PyQt4 精彩实例分析* 实例2 标准对话框的使用
- PyQt4 精彩实例分析* 实例4 使用标准输入框
- PyQt4 精彩实例分析* 实例6 实现QQ抽屉效果
- PyQt4 精彩实例分析* 实例7 表格的使用
- PyQt4 精彩实例分析* 实例8 使用进度条
- PyQt4 精彩实例分析* 实例11 动态加载Ui
- *PyQt4 精彩实例分析* 实例3 各类位置信息
- PyQt4 精彩实例分析* 实例13 多文档
- *PyQt4 精彩实例分析* 实例14 分割窗口
- PyQt4 精彩实例分析* 实例15 停靠窗口
- PyQt4 精彩实例分析* 实例18 可扩展对话框
- PyQt4 精彩实例分析* 实例21 不规则窗体
- *PyQt4 精彩实例分析* 实例23 程序启动画面
- FM 原创街舞
- Objective-C的动态特性
- Matlab 批量导入txt文件
- Maven 手动安装JAR包 到本地仓库
- VirtualBox虚拟机的四种主要网络设置方式
- PyQt4 精彩实例分析* 实例12 基本布局管理
- mysql使用 limit 1提高查询效率
- SD-sap是如何确定条件值的数值或者比例(KBERT)的?
- 已知先序,中序,求后序
- GC 日志分析
- 安装ruby 2.0
- 关于运放的选择
- jsf mysql
- Can I use NDMP to backup from (or to) appliance?