qt——常⽤的布局⽅法
布局相关对象及简介
窗体上的所有的控件必须有⼀个合适的尺⼨和位置。Qt提供了⼀些类负责排列窗体上的控件,主要有:
QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。(布局管理类)这些类简单易⽤,⽆论在代码中还是⽤Qt Designer开发程序都能⽤到。
1)布局类简介
QHBoxLayout:⽔平布局
QVBoxLayout:垂直布局
QGridLayout:表格布局
QGridLayout::addWidget()语法
layout->addWidget(widget, row, column, rowSpan, columnSpan);
参数widget:为插⼊到这个布局的⼦控件;
参数(row,column)为控件占据的左上⾓单元格位置;
参数rowSpan是控件占据的⾏数,
参数colunmSpan是控件占据的列的个数。
(rowSpan和colunmSpan默认值为1)
Stacked Layouts:分组布局
QStackedLayout类把⼦控件进⾏分组或者分页,⼀次只显⽰⼀组或者⼀页,隐藏其他组或者页上的控件。
使⽤这些Qt布局管理类的另⼀个原因是,在程序、系统改变字体,语⾔或者在不同的平台上运⾏时,布局管理器能够⾃动调整窗体⾥所有控件的⼤⼩和尺⼨。
其他可进⾏布局管理的类:这些类的共同特点是提供了更加灵活的布局管理,在⼀定程度上⽤户能够控制窗体内控件的⼤⼩。QSplitter,QScrollArea,QMainWindow,QWorkspace(对多⽂档的⽀持)
2)布局管理中结合控件的sizePolicy属性,进⾏调整
结合控件的SizePolicy属性,来控制布局管理中的控件的尺⼨⾃适应⽅式。
控件的sizePolicy说明控件在布局管理中的缩放⽅式。Qt提供的控件都有⼀个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布
局,开发⼈员经常需要改变窗体上的某些控件的sizePolicy。⼀个QSizePolicy的所有变量对⽔平⽅向和垂直⽅向都适⽤。下⾯列举了⼀些最长⽤的值:
A. Fixed:控件不能放⼤或者缩⼩,控件的⼤⼩就是它的sizeHint。
B. Minimum:控件的sizeHint为控件的最⼩尺⼨。控件不能⼩于这个sizeHint,但是可以
放⼤。
C. Maximum:控件的sizeHint为控件的最⼤尺⼨,控件不能放⼤,但是可以缩⼩到它的最⼩
的允许尺⼨。
D. Preferred:控件的sizeHint是它的sizeHint,但是可以放⼤或者缩⼩
E. Expandint:控件可以⾃⾏增⼤或者缩⼩
注:sizeHint(布局管理中的控件默认尺⼨,如果控件不在布局管理中就为⽆效的值)
3)布局管理的三种⽅式
Qt中有三种⽅式对窗体上的控件进⾏布局管理:绝对位置定位(absolute positioning),⼿⼯布局(manual layout),布局管理器(layout managers)
3-1 绝对位置定位(控件布局是固定位置,没有⾃适应功能)
例⼦:
QWidget *pWidget = new QWidget;
QLabel label(pWidget);
label.setText(QObject::tr("姓名:"));
label.setGeometry(10,10,20,20);
QLineEdit namedLineEdit("⼩明",pWidget);
namedLineEdit.setGeometry(35,10,50,20);
QPushButton *btn = new QPushButton(QObject::tr("关闭"),pWidget);
btn->setGeometry(90,10,40,20);
图例:
3-2 ⼿⼯布局
给出控件的绝对位置,但是他们的尺⼨根据窗⼝的⼤⼩确定,可以通过重写窗体控件的resizeEvent()实现对⼦控件的⼤⼩设置。
3-3 布局管理器
例⼦1:运⽤QHBoxLayout、QVBoxLayout、QGridLayout布局
//leftLayout布局设置(表格布局)
/* QGridLayout: ⼆维的单元格*/
QGridLayout *leftLayout = new QGridLayout;
leftLayout->addWidget(&namedLabel, 0, 0); //起始(0⾏,0列),尺⼨(1⾏,1列)
leftLayout->addWidget(&namedLineEdit, 0, 1);
leftLayout->addWidget(&lookInLabel, 1, 0);
leftLayout->addWidget(&lookInLineEdit, 1, 1);
leftLayout->addWidget(&subDirCheckBox, 2, 0, 1, 2);//起始(3⾏,0列),尺⼨(1⾏,2列) leftLayout->addWidget(&tableWidget, 3, 0, 1, 2);
leftLayout->addWidget(&messageLabel, 4, 0, 1, 2);
//rightLayout布局设置(垂直布局)
QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(&findButton);
rightLayout->addWidget(&stopButton);
rightLayout->addWidget(&closeButton);
//布局管理器在指定的位置留出⼀块空间(Qt Designer中,可以加⼊⼀个spacer实现这⼀功能) rightLayout->addStretch();
rightLayout->addWidget(&helpButton);
//mainLayout布局设置(⽔平布局)
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
pWidget->setLayout(mainLayout);//设置Widget窗⼝控件的布局风格
pWidget->setWindowTitle(QObject::tr("查⽂件及⽂件夹"));
例⼦1图列:
3-4 例⼦2:运⽤Stacked Layouts:分组布局
例⼦:
//创建QWidget类的⼀个对象pWidget
QWidget *pWidget = new QWidget;
/
/创建⼀个布局管理器类 layout
QHBoxLayout *manLayout = new QHBoxLayout;
//左边的列表控件
QListWidget *listWidget = new QListWidget(pWidget); listWidget->addItem(QObject::tr("外观设置")); listWidget->addItem(QObject::tr("⽹页浏览"));
...
//右边的分页控件
QWidget *page1 = new QWidget(pWidget);
<…page1上增加控件>
QWidget *page2 = new QWidget(pWidget);
<…page2上增加控件>
<;设置布局管理>
QVBoxLayout *leftLayout = new QVBoxLayout; leftLayout->addWidget(listWidget);
....
//右边分页布局(两页窗⼝)
QStackedLayout *stackedLayout = new QStackedLayout;
stackedLayout->addWidget(page1);
stackedLayout->addWidget(page2);
java布局管理器//通过调⽤QWidget::setLayout()函数,将layout布局管理器类添加到窗⼝部件对象pWidget中manLayout->addLayout(leftLayout);
manLayout->addLayout(stackedLayout);
pWidget->setLayout(manLayout);
listWidget->setCurrentRow(0);
//关联:列表与分组布局
QObject::connect(listWidget, SIGNAL(currentRowChanged(int)),
stackedLayout, SLOT(setCurrentIndex(int)));
pWidget->show();
图例:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论