Qt的UI布局以及控件间隔(Spacing)边距(Margins)
来源:互联网 发布:微积分教材 知乎 编辑:程序博客网 时间:2024/06/07 20:00
替一个Widget设置布局有两种方法。
1layout 构造函数传递QWidget
QVBoxLayout* MainQVboxLayout=new QVBoxLayout(MainWidget);
2layout构造函数传递NULL,调用QWidget的setlayout设置布局
QVBoxLayout* MainQVboxLayout=new QVBoxLayout();
MainWidget->setLayout(MainQVboxLayout);
注意,当一个widget已经存在布局的时候。调用setLayout会失败,如果要设置,必须先通过Widget的 layout方法(
QLayout *layout() const)得到原来的指针,然后删除再调用setlayout。Q:得到layout指针,delete后就能重新设置,不需要其他操作怎么做的?
A:widget使用setLayout的时候会检查原有的值是否为NULL,如果不为NULL就失败,delete layout的时候,析构函数会将这个layout属于的widget的这个值设置为0。
所以delete以后又可以设置了
QLayout::~QLayout()
{
Q_D(QLayout);
if (d->topLevel && parent() && parent()->isWidgetType() &&
((QWidget*)parent())->layout() == this)
((QWidget*)parent())->d_func()->layout = 0; //这里设置了为0
}
Q:为什么MainWindow调用setLayout失败?
A:MainWindow是一个组合体,已经包含了默认的layout,要通过setcenterwidget来操作中间的一块区域。
V H BOXlayout
在一个layout里面添加另一个layout如下
FuncBarQHboxLayout=new QHBoxLayout();
MainQVboxLayout->addLayout(FuncBarQHboxLayout);
Q: delete MainQVboxLayout的时候 FuncBarQHboxLayout会被删除吗,还是需要自己处理?
A:不需要自己处理。删除MainQVboxLayout的时候会自动删除他add的layout
QBoxLayout::~QBoxLayout()
{
Q_D(QBoxLayout);
d->deleteAll(); //删除了这些layout
}
在H 或者V layout里面添加一个控件调用
layout->addWidget(xxx) 这个是依照次序添加的。从左到右,从上到下。
如果有些子类已经实现了一些spacer函数,比如Vbox Hbox,那么用添加spacer用addSpacerItem
一般不直接使用layout->addItem() addItem定义了如何添加,由子类实现,通常用layoutitem封装一个widget或者spacer,把不同的类对象变成layout可以识别的
统一layoutitem,laytouitem可以容纳很多东西
弹簧控件的构造和使用
SpacerItem(w,h,hPolicy,vPolicy)
w是优先的高度h是优先的宽度
hPolicy是水平方向上的策略
vPolicy是垂直方向上的策略。
如果是水平弹簧 那么hPolicy=expanding vPolicy=minimum
如果是垂直弹簧那么hPolicy=minimum vPolicy=expanding
GridLayout 添加控件和Spacer
添加控件用AddWidget
添加Spacer用AddItem
不管用哪个函数都要了解他的四个关键参数
row 控件起始单元格的行位置
column 控件起始单元格的列位置
rowspan 控件所占的行个数
columnspan 控件所占的列个数
例如 0 0 2 1就是该控件排放在0,0起始的位置,占2行1列。
例如 2 3 4 2就是该控件排放在2,3起始的位置,占4行2列。
同时需要设置控件的Policy。
布局还有一个重要的值。是伸缩因子Stretch
Stretch反应的是控件和控件之间的比例。比如
setStretch(0,1)第0个位置的伸缩因子为1
setStretch(1,2)第1个位置的伸缩因子为2
因此第二个控件的大小尽量为第一个的两倍。只能是尽量,因为还有其他的条件限制。比如maxsize,minsize,或者fixed策略minimal策略之类的。
另外一个是调控控件的间隔和边界部分
layout可以使用 setspacing设置控件之间的间隔。gridlayout使用 setverticalspacing或者sethorizontalspacing 来设置
layout通过使用setcontentmargins来设置四周留白的间隔。
部分 Widget 可以通过setcontentmargins来设置四周留白的间隔。setcontentmargins主要是为layout设计使用的。不是所有的Widget都可以使用,有部分是可以的比如Label这一类,具体是否有用要看这个控件的具体实现。比如comboBox就是不可以的。
- Qt的UI布局以及控件间隔(Spacing)边距(Margins)
- 关于UI布局中的常见布局类型、控件、控件属性以及引入布局的说明
- qt 的ui界面设计师中的布局 控件QWidget中使用的布局
- Android(UI)布局(文件)控件标签的通用属性
- Qt UI布局
- QT UI美化 布局
- 基本的UI控件和布局文件
- Android的UI布局以及常用属性
- QT的学习之路 1布局控件(Layout)
- Qt自定义控件以及控件的提升
- Android UI布局与控件(二)
- QT 学习笔记 窗口控件的布局
- Qt删除布局内的控件
- 控件(按键、输入部件、显示控件、空间间隔、布局管理、容器、项目视图)
- Android中UI控件的详细介绍(二)—— 非布局控件总览
- QT [007] QT UI 的控件操控问题
- Qt控件布局
- Qt 控件自动布局
- Delphi异常处理的基本原则和方法
- [从头学数学] 第246节 Python实现数据结构:链表
- Android图像处理—xfermode
- HDU 5747 Aaronson(贪心)
- Thinking in Java 第18章 Java I/O 系统(18.9-18.14)
- Qt的UI布局以及控件间隔(Spacing)边距(Margins)
- js获取select标签选中的值
- 判断二叉树是否平衡
- LeetCode[343] Integer Break
- LinearLayout中的baselineAligned与layout_weight
- python inspect模块解析
- 关键字
- PAT 乙级1004. 成绩排名 (JAVA版)
- Delphi 快捷键