目錄
概述
Group Box
核心屬性?
Tab Widget
核心屬性
核心信號
核心方法?
使用示例:
布局管理器
垂直布局
核心屬性
使用示例:
水平布局
核?屬性 (和 QVBoxLayout 屬性是?致的)
網格布局
核心屬性
使用示例:
示例: 設置水平拉伸系數
示例:設置垂直拉伸系數
表單布局
使用示例:
spacer
核心屬性
使用示例:
概述
????????所謂容器類控件就是可以容納其他控件的控件。這與之前多元素控件不一樣的地方是:多元素控件包含的內容,是一個一個自定義好的 ”Item“ 對象。而容器類控件,包含的內容是前面所介紹過的各種控件。
Group Box
核心屬性?
屬性 | 說明 |
---|---|
title | 分組框的標題 |
alignment | 分組框內部內容的對??式 |
flat | 是否是 "扁平" 模式 |
checkable | 是否可選擇. 設為 true, 則在 title 前?會多出?個可勾選的部分. |
checked | 描述分組框的選擇狀態 (前提是 checkable 為 true) |
Tab Widget
核心屬性
屬性 | 方法 |
---|---|
tabPosition | 標簽?所在的位置.
|
currentIndex | 當前選中了第?個標簽? (從 0 開始計算) |
currentTabText | 當前選中的標簽?的?本 |
currentTabName | 當前選中的標簽?的名字 |
currentTabIcon | 當前選中的標簽?的圖標 |
currentTabToolTip | 當前選中的標簽?的提?信息 |
tabsCloseable | 標簽?是否可以關閉 |
movable | 標簽?是否可以移動 |
核心信號
屬性 | 說明 |
---|---|
currentChanged(int) | 在標簽?發?切換時觸發, 參數為被點擊的選項卡編號 |
tabBarClicked(int) | 在點擊選項卡的標簽條的時候觸發. 參數為被點擊的選項卡編號. |
tabBarDoubleClicked(int) | 在雙擊選項卡的標簽條的時候觸發. 參數為被點擊的選項卡編號. |
tabCloseRequest(int) | 在標簽?關閉時觸發. 參數為被關閉的選項卡編號. |
核心方法?
方法 | 說明 |
---|---|
count() | 獲取到標簽?的個數 |
addTab | 新增標簽? |
removeTab | 刪除標簽? |
currentIndex | 獲取到當前標簽?的下標 |
setCurrentIndex | 切換當前標簽? |
使用示例:
1. 添加新的標簽頁
//獲取當前有幾個標簽頁了int count = ui->tabWidget->count();//創建新的widgetQWidget* w = new QWidget();ui->tabWidget->addTab(w,QString("Tab")+QString::number(count+1));
2. 刪除選中標簽頁
int curIndex = ui->tabWidget->currentIndex();ui->tabWidget->removeTab(curIndex);
布局管理器
垂直布局
核心屬性
屬性 | 說明 |
---|---|
layoutLeftMargin | 左側邊距 |
layoutRightMargin | 右側邊距 |
layoutTopMargin | 上?邊距 |
layoutBottomMargin | 下?邊距 |
layoutSpacing | 相鄰元素之間的間距 |
使用示例:
//創建三個按鈕QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");//創建布局管理器QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);//把布局管理器添加到窗口this->setLayout(layout);
?也可以選中要放入管理器的控件,如下:
最終效果:
水平布局
核?屬性 (和 QVBoxLayout 屬性是?致的)
屬性 | 說明 |
---|---|
layoutLeftMargin | 左側邊距 |
layoutRightMargin | 右側邊距 |
layoutTopMargin | 上?邊距 |
layoutBottomMargin | 下?邊距 |
layoutSpacing | 相鄰元素之間的間距 |
Layout ??可以再嵌套上其他的 layout, 從?達到更復雜的布局效果;結合 QHBoxLayout 和 QVBoxLayout , 就可以做出各種復雜的界?了。
網格布局
Qt 中還提供了 QGridLayout ?來實現?格布局的效果. 可以達到 M * N 的這種?格的效果.
核心屬性
屬性 | 說明 |
---|---|
layoutLeftMargin | 左側邊距 |
layoutRightMargin | 右側邊距 |
layoutTopMargin | 上?邊距 |
layoutBottomMargin | 下?邊距 |
layoutHorizontalSpacing | 相鄰元素之間?平?向的間距 |
layoutVerticalSpacing | 相鄰元素之間垂直?向的間距 |
layoutRowStretch | ??向的拉伸系數 |
layoutColumnStretch | 列?向的拉伸系數 |
使用示例:
效果圖:
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QGridLayout>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");QPushButton* btn4 = new QPushButton("按鈕4");QGridLayout* layout = new QGridLayout(this);layout->addWidget(btn1,0,0);layout->addWidget(btn2,0,1);layout->addWidget(btn3,1,0);layout->addWidget(btn4,1,1);
}
這里的addwidget的后兩個參數是指定元素所在行號和列號?
當需要創建出尺寸不同的控件時,就可以通過拉伸系數來設置,拉伸系數就相當于設置控件之間尺寸的比例
示例: 設置水平拉伸系數
layout->setColumnStretch(0,1);layout->setColumnStretch(1,2);
?如果拉伸系數為0(上述代碼中的第二個參數),就是不參與拉伸,此時按鈕的寬度是固定值
示例:設置垂直拉伸系數
?直接設置垂直拉伸系數是沒有效果的,因為按鈕垂直方向默認沒有拉伸開(水平方向默認是拉伸的),因此垂直方向不會受到拉伸系數的影響了,需要設置SizePolicy。
使? setSizePolicy 設置按鈕的尺?策略. 可選的值如下:
- QSizePolicy::Ignored : 忽略控件的尺?,不對布局產?影響。
- QSizePolicy::Minimum : 控件的最?尺?為固定值,布局時不會超過該值。
- QSizePolicy::Maximum : 控件的最?尺?為固定值,布局時不會?于該值
- QSizePolicy::Preferred : 控件的理想尺?為固定值,布局時會盡量接近該值。
- QSizePolicy::Expanding : 控件的尺?可以根據空間調整,盡可能占據更多空間。
- QSizePolicy::Shrinking : 控件的尺?可以根據空間調整,盡可能縮?以適應空間。
?要想讓垂直方向的拉伸系數生效,就需要讓按鈕能夠拉伸展開,代碼如下
btn1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
然后再設置垂直方向的拉伸系數即可。?
表單布局
這種表單布局多?于讓??填寫信息的場景. 左側列為提?, 右側列為輸?框
- 使? addRow ?法來添加??. 每?包含兩個控件. 第?個控件固定是 QLabel / ?本, 第?個控件 則可以是任意控件.
- 如果把第?個參數填寫為 NULL, 則什么都不顯?
使用示例:
// 創建 layoutQFormLayout* layout = new QFormLayout();this->setLayout(layout);// 創建三個 labelQLabel* label1 = new QLabel("姓名");QLabel* label2 = new QLabel("年齡");QLabel* label3 = new QLabel("電話");// 創建三個 lineEditQLineEdit* lineEdit1 = new QLineEdit();QLineEdit* lineEdit2 = new QLineEdit();QLineEdit* lineEdit3 = new QLineEdit();// 創建?個提交按鈕QPushButton* btn = new QPushButton("提交");// 把上述元素添加到 layout 中layout->addRow(label1, lineEdit1);layout->addRow(label2, lineEdit2);layout->addRow(label3, lineEdit3);layout->addRow(NULL, btn);
spacer
核心屬性
屬性 | 說明 |
---|---|
width | 寬度 |
height | ?度 |
hData | ?平?向的 sizePolicy ? QSizePolicy::Ignored : 忽略控件的尺?,不對布局產?影響。 ? QSizePolicy::Minimum : 控件的最?尺?為固定值,布局時不會超過該值。 ? QSizePolicy::Maximum : 控件的最?尺?為固定值,布局時不會?于該值。 ? QSizePolicy::Preferred : 控件的理想尺?為固定值,布局時會盡量接近該 值。 ? QSizePolicy::Expanding : 控件的尺?可以根據空間調整,盡可能占據更多空 間。 ? QSizePolicy::Shrinking : 控件的尺?可以根據空間調整,盡可能縮?以適應 空間。 |
vData | 垂直?向的 sizePolicy 選項同上. |
使用示例:
ui->setupUi(this);QHBoxLayout* layout = new QHBoxLayout();this->setLayout(layout);QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");layout->addWidget(btn1);layout->addWidget(btn2);
在未引入spacer時,兩個按鈕創建是挨著的
QSpacerItem在初始化要指定寬度和高度?
ui->setupUi(this);QHBoxLayout* layout = new QHBoxLayout();this->setLayout(layout);QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QSpacerItem* space = new QSpacerItem(200,20);layout->addWidget(btn1);layout->addSpacerItem(space);layout->addWidget(btn2);
引入spacer后?
?