Qt布局管理器

Qt布局管理器

放置在窗体中的每一个窗体部件都必须给定一个合适的大小和位置。Qt提供了多个用于在窗体中摆放窗口部件的类:QHBoxLayout、QVBoxLayout、QGridLayout和QS’ta’ckLayout。

使用Qt布局类的另外一个原因是:它们可以确保窗体能够自动适应于不同的字体、语言和系统平台。

执行布局管理器功能的其他类还有QSplitter、QScrollArea、QMainWindow和QMdiArea。这些类所拥有的共同点在于它们提供了一种用户可以灵活掌控的布局方式。

一个窗口部件的大小策略会告诉布局系统应该如何对它进行拉伸或者压缩。Qt为它所有的内置窗口部件都提供了合理的默认大小策略值,但是由于不可能为每一种可能产生的布局都提供唯一的默认值,所以在一个窗体中,开发人员改变它上面的一个或两个窗口部件的大小策略是非常普遍的现象。一个QSizePolicy即包含一个水平分量也包含一个垂直分量。以下是一些最为常用的取值。

Fixed的意思是该窗口部件不能被拉伸或者压缩。窗口部件的大小尺寸总是保持为其大小提示尺寸。

Minimum的意思是该窗口部件的大小提示就是它的最小大小。再不能把窗口部件压缩到比这个大小提示还要小,但是可以把该窗口部件拉伸。

Preferred的意思是该窗口部件的大小提示就是它比较合适的大小。但是如果需要,还是可以对该窗口部件进行拉伸或者压缩。

Expanding的意思是可以拉伸或者压缩该窗口部件,并且它特别希望能够变长变高。

除了大小规则中包含的水平方向和垂直方向两个分量之外,QSizePolicy类还保存了水平方向和垂直方向的一个拉伸因子。这些拉伸因子可以用来说明再增大窗体时,对不同的子窗口部件应使用不同放大比例。

影响布局方式的另一种方法是设置它的子窗口部件的最小大小、最大大小或固定大小。当布局管理器在摆放这些窗口部件的时候,它就会考虑这些约束条件。并且如果这样还不够的话,还可以对子窗口部件的类进行派生并且重新实现sizeHint()函数,由此获得所需的大小提示。

切分窗口QSplitter

切分窗口就是一个可以包含一些其他窗口部件的窗口部件。在切分窗口中的这些窗口部件会通过切分条而分开。用户可以通过拖动这些切分条来改变切分窗口中子部件的大小。

QSplitter *right_spliter = new QSplitter(Qt::Vertical);
right_spliter->addWidget(new QTextEdit());
right_spliter->addWidget(new QTextEdit());
right_spliter->setStretchFactor(1,1);
QSplitter *main_spliter = new QSplitter(Qt::Horizontal);
main_spliter->addWidget(new QTextEdit());
main_spliter->addWidget(right_spliter);
main_spliter->setStretchFactor(1,1);
this->setCentralWidget(main_spliter);
#把某部件伸展因子设为1,可以确保多余的空间给其他部件。
滚动窗口QScrollArea

QScrollArea类提供了一个可以滚动的视口和两个滚动条。

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    IconEditor *iconEditor = new IconEditor;
    iconEditor->setIconImage(QImage(":/images/mouse.png"));
    QScrollArea scrollArea;
    scrollArea.setWidget(iconEditor);
    scrollArea.viewport()->setBackgroundRole(QPalette::Dark);
    scrollArea.viewport()->setAutoFillNackground(true);
    scrollArea.setWindowTitle(tr("Icon Editor"));
    scrollArea.Show();
    return app.exec();
}

默认情况下,只有在视口的大小小于子窗口部件的大小时,才会把滚动条显示出来。但通过设置滚动条的策略,可以强制滚动条总是可见的。

scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
scrollArea.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
停靠窗口

停靠窗口是指一些可以停靠在QMainWindow中或是浮动为独立窗口的窗口。QMainWindow提供了4个停靠窗口区域:分别在中央窗口的上部、下部、左侧、右侧。

[外链图片转存失败(img-uDphoxbV-1566638407081)(C:\Users\lrt\AppData\Roaming\Typora\typora-user-images\1566636707845.png)]

以下程序片段说明了如何对QDockWidget中已经存在的窗口部件进行分装,并把它插入到右侧的停靠区域。

QDockWidget *shapes_dock_widget = new QDockWidget(tr("shapes"));
shapes_dock_widget->setObjectName("shapes_dock_widget");
shapes_dock_widget->setWidget(new QTreeWidget());
shapes_dock_widget->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
addDockWidget(Qt::LeftDockWidgetArea,shapes_dock_widget);
工具栏

下面的代码显示了如何创建一个工具栏的过程。

QToolBar *fontToolBar = new QToolBar(tr("font"));
fontToolBar->setObjectName("fontToolBar");
fontToolBar->addWidget(new QComboBox());
fontToolBar->addWidget(new QSpinBox());
fontToolBar->setAllowedAreas(Qt::TopToolBarArea|Qt::BottomToolBarArea);
addToolBar(fontToolBar);

lBar->setAllowedAreas(Qt::TopToolBarArea|Qt::BottomToolBarArea);
addToolBar(fontToolBar);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值