Qt基础 - Qt Layout Management

 

Qt的版面配置(layout)系統提供了一個簡單有效的方法來做child widget的版面編排。使用版面配置具有下列的優點:

  • 將child widget的位置做編排
  • 可調整的視窗預設大小
  • 可調整的視窗最小大小
  • 可調整視窗大小
  • 根據內容自動調整:
    • child widget的字型大小、文字或其他內容
    • 隱藏或顯示child widget
    • 移除child widget


其實使用者也可以直接經由撰寫程式碼做版面配置,但卻是相當不方便,因為每次修改都需要重新compile、link以及執行後才知道修改後的結果。有鑑於此,Qt也提供了好用的工具 - Qt designer。Qt designer是一個GUI視覺化的設計工具,能讓視窗版面配置更為快速、簡單,有關Qt Designer將會在後面章節說明,本章將對如何撰寫程式碼進行版面配置說做名。

 

[編輯] Horizontal、Vertical、Grid Layouts

首先介紹最簡單的版面配置方法,那就是使用Qt提供的基本的版面配置管理:QHBoxLayout、QVBoxLayout與QGridLayout。這些類別是繼承自QLayout類別(再繼承自QObject類別)。這些類別主要負責widget版面位置的管理,經由這些版面配置處理可以產生更複雜的版面配置。

 

  • QHBoxLayout將widget編排成水平的一列:

下列的程式碼建立一個QHBoxLayout,將5個QPushButton放置其中,其結果如圖所示:

QWidget *window = new QWidget;
     QPushButton *button1 = new QPushButton("One");
     QPushButton *button2 = new QPushButton("Two");
     QPushButton *button3 = new QPushButton("Three");
     QPushButton *button4 = new QPushButton("Four");
     QPushButton *button5 = new QPushButton("Five");
 
     QHBoxLayout *layout = new QHBoxLayout;
     layout->addWidget(button1);
     layout->addWidget(button2);
     layout->addWidget(button3);
     layout->addWidget(button4);
     layout->addWidget(button5);
 
     window->setLayout(layout);
     window->show();

qhboxlayout-with-5-children.png

 

  • QVBoxLayout將widget編排成為垂直的一行:

QVBoxLayout的程式碼與上述的QHBoxLayout類似,其產生的結果如下:

qvboxlayout-with-5-children.png

 

  • QGridLayout將widget編排成為二維的格子狀,widget可以佔據多個格子:

而使用QGridLayout則有些微不同,因為必須要指定widget的行與列位置。

QWidget *window = new QWidget;
     QPushButton *button1 = new QPushButton("One");
     QPushButton *button2 = new QPushButton("Two");
     QPushButton *button3 = new QPushButton("Three");
     QPushButton *button4 = new QPushButton("Four");
     QPushButton *button5 = new QPushButton("Five");
 
     QGridLayout *layout = new QGridLayout;
     layout->addWidget(button1, 0, 0);
     layout->addWidget(button2, 0, 1);
     layout->addWidget(button3, 1, 0, 1, 2);
     layout->addWidget(button4, 2, 0);
     layout->addWidget(button5, 2, 1);
 
     window->setLayout(layout);
     window->show();

qgridlayout-with-5-children.png

第三個QPushButton佔據了2行,所以在QGridLayout::addWidget()中指定了第五個參數2。使用這種版面配置,對child widget做版面配置時將不需要將parent widget參數引進來,此版面配置會自動利用QWidget::setParent()把Parent widget傳進來。

當使用者使用某個layout於這個視窗應用程式,而在這個layout中加入其他widget(譬如上例中的PushButton),則這些widget都自動成為那個視窗應用程式使用此layout的child widget(記住,widget不能繼承自layout,只有widget之間才行)。

此外,你可以利用addLayout()在版面配置中再加入其他版面配置;addLayout()中加入的版面配置就會成為外面版面配置的child,即可形成更複雜的版面配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值