QT layout

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,即可形成更複雜的版面配置。

      1. 设计一个窗体,安排好它的函数和属性。

      2. 基本的layout包括四类,QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout。前两个将widget水平或竖直防止,grid将widget以格子的形式放置,formlayout将widget以row的形式放置。

      3. layout的使用方法是,先定一个layout,再向这个layout中添加widget,然后使用父类中的setlayout(),设置这个widget的layout。

      4. layout有一个setMenubar,可以使得Dialog也可以设置菜单栏。

      5. 在定义类时,定义一个enum,之后就可以直接使用这个enum中的元素。

      6. QT赋参数的方法为tr("Button %1").arg(i + 1)。

      7. QGridLayout有setColumnStretch(int, int)方法,用于设置grid中格子的伸长因子,也就是能够占用多大的空间。

      8. QDialogButtonBox指用于确定/退出的button组。它是这两类常用button的一个box组合。

      9. 本例中涉及到的其它widget包括:

             a.  QTextEdit,文本编辑框,支持plain text和html text

             b.  QPushButton,按钮

             c.  QGroupBox,将widget以box的形式组织在一起

             d. QLineEdit,行编辑框

             e. QComboBox,下拉框

             f. QSpinBox,spin框,提供数值选择。

Qt 布局使用关键:
    一个控件的大小方针用于告知系统该控件如何伸展和收缩,Qt为所有内建的控件提供了默认的大小伸缩规则,
    一个QSizePolicy 拥有垂直和水平两个成分,下面是一些有用的值:
        
    Fixed : 意味着窗口的大小不能被伸展或缩小,窗口总是它默认的大小。
    Minimum : 意味着窗口的默认大小是它的最小值,该窗口收缩时大小不能小于 size hint,但是如果需要,它可以伸展。
    Maxmum : 意味着窗口的默认大小是它的最大值,可缩小,但值必须小于size hint
    Preferred : 窗口的大小是优先值。如果有需要,它可伸展也可收缩
    Expanding :意味着窗口的大小随意伸缩。
    
    乍看,Preferred 和Expanding 描述的是一种方式,但是,它们之间的不同在于,当一个窗口中同时包含Preferred 和 Expanding 的
    控件时,当窗口控件大小改变时,额外的空间将给Expanding 控件,而Preferred 保持原有大小不变。
    
    QSizePolice 还保存着水平和垂直伸展因子。当窗口伸展时,不同的伸缩因子代表着不同控件的伸缩比例,例如,如果我们有一个QTreewidget
     在QTextEdit之上,我们想要QTextEdit的垂直高度是QTreeWidget的两倍,那么我们只需要设置QTextEdit的垂直因子为2,再设置QTreeWidget
     的垂直因子为1,就可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值