Qt:布局管理器Layout

目錄

布局管理器

QVBoxLayout

QHBoxLayout

QGirdLayout

QFormLayout?

Spacer


布局管理器

在以往的界面操作上,都是程序員手動拖動控件來布局,這種方式有一些不足之處,比如不能很好的把握控件之間的距離,以及控件的大小,并且在最終的窗口中,改變窗口大小時,控件的大小不能很好的適應。

于是,引入布局管理器,它是一種控件,可以自動管理其他控件。

常見的布局管理器有垂直布局管理器、水平布局管理器、網格布局、表單布局。

QVBoxLayout

?

布局管理器只用于界面布局,不提供信號。

?

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");// 創建布局管理器, 并且把按鈕添加進去// 如果創建的時候指定?元素為 this, 則后?不需要 setLayout ?法了.QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);// 把布局管理器設置到 widget 中this->setLayout(layout);
}

?

每個Widget只能設置一個布局管理器。

使用Qt Design創建兩個布局管理器

?

?

程序運行后,界面可以正常顯示。但是,這兩個布局管理器并不會適應窗口的大小變化,因為本質上這是兩個Widget。

QHBoxLayout

垂直布局中可以嵌套一個水平布局,反過來也可以。

QGirdLayout

網格布局,可以實現M * N的效果。

?

?

 QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");QPushButton* btn4 = new QPushButton("按鈕4");QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 1, 1);layout->addWidget(btn3, 2, 2);layout->addWidget(btn4, 3, 3);this->setLayout(layout);

?

?

  • ?設置水平方向的拉伸系數

?

// 創建 6 個按鈕QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");QPushButton* btn4 = new QPushButton("按鈕4");QPushButton* btn5 = new QPushButton("按鈕5");QPushButton* btn6 = new QPushButton("按鈕6");// 創建?格布局管理器, 并且添加元素QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 0, 1);layout->addWidget(btn3, 0, 2);layout->addWidget(btn4, 1, 0);layout->addWidget(btn5, 1, 1);layout->addWidget(btn6, 1, 2);// 設置拉伸?例// 第 0 列拉伸?例設為 1;layout->setColumnStretch(0, 1);// 第 1 列拉伸?例設為 0, 即為固定??, 不參與拉伸layout->setColumnStretch(1, 0);// 第 2 列拉伸?例設為 3, 即為第 2 列的寬度是第 0 列的 3 倍layout->setColumnStretch(2, 3);// 設置 layout 到窗?中.this->setLayout(layout);

?

  • 設置垂直方向的拉伸系數

?

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 創建 6 個按鈕QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");QPushButton* btn4 = new QPushButton("按鈕4");QPushButton* btn5 = new QPushButton("按鈕5");QPushButton* btn6 = new QPushButton("按鈕6");// 設置按鈕的 sizePolicy, 此時按鈕的?平?向和垂直?向都會盡量舒展開btn1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);// 創建?格布局管理器, 并且添加元素QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 0, 1);layout->addWidget(btn3, 1, 0);layout->addWidget(btn4, 1, 1);layout->addWidget(btn5, 2, 0);layout->addWidget(btn6, 2, 1);// 設置拉伸?例// 第 0 ?拉伸?例設為 1;layout->setRowStretch(0, 1);// 第 1 ?拉伸?例設為 0, 即為固定??, 不參與拉伸layout->setRowStretch(1, 0);// 第 2 ?拉伸?例設為 3, 即為第 2 ?的寬度是第 0 ?的 3 倍layout->setRowStretch(2, 3);
// 設置 layout 到窗?中.this->setLayout(layout);}

?

什么是SizePolicy

在界面中,每個按鈕的高度是固定,即使布局管理器按照比例設置了拉伸系數,也是沒有效果的,而想讓設置生效,就要設置每個按鈕的SizePolicy,按鈕的尺寸策略有如下幾種。

使? setSizePolicy 設置按鈕的尺?策略. 可選的值如下:
QSizePolicy::Ignored : 忽略控件的尺?,不對布局產?影響。
QSizePolicy::Minimum : 控件的最?尺?為固定值,布局時不會超過該值。
QSizePolicy::Maximum : 控件的最?尺?為固定值,布局時不會?于該值。
QSizePolicy::Preferred : 控件的理想尺?為固定值,布局時會盡量接近該值。
QSizePolicy::Expanding : 控件的尺?可以根據空間調整,盡可能占據更多空間。
QSizePolicy::Shrinking : 控件的尺?可以根據空間調整,盡可能縮?以適應空間。

總的來說, 使? QGridLayout 能夠代替很多 QHBoxLayout QVBoxLayout 嵌套的場景. 畢
竟嵌套的代碼寫起來是?較?煩的.
另外不要忘了, QGridLayout ??也能嵌套 QHBoxLayout QVBoxLayout , QHBoxLayout 和 QVBoxLayout ??也能嵌套 QGridLayout 。靈活使?上述布局管理器, 就可以實現出任意的復雜界?。

QFormLayout?

表單布局,N行2列,主要用于填表這樣的場景。

?

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 創建 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

Spacer不屬于布局管理器,往往搭配在布局管理器中使用,表示一個空白塊,可以用來讓兩個控件之間的距離變大。

  • 屬性

?

?

Widget::Widget(QWidget *parent): QWidget(parent)
, ui(new Ui::Widget){ui->setupUi(this);QHBoxLayout* layout = new QHBoxLayout();this->setLayout(layout);QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");// 創建 SpacerQSpacerItem* spacer = new QSpacerItem(200, 20);layout->addWidget(btn1);// 在兩個 widget 中間添加空?layout->addSpacerItem(spacer);layout->addWidget(btn2);}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88596.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java編程動手學】深入剖析Java網絡編程:原理、協議與應用

文章目錄一、引言二、計算機網絡基礎1、計算機網絡的概念2、網絡地址的重要性三、套接字編程:網絡通信的基石1、套接字的概念2、TCP通信編程示例四、TCP通信編程:可靠的數據傳輸1、TCP協議的特點2、實際應用中的TCP通信五、UDP通信編程:高效的…

vue3.2 前端動態分頁算法

文章目錄背景思路頁面情況核心代碼小結效果背景 1. 后臺接口只是動態返回一個數組的數據,前端需要根據數據量的大小判斷是否需要分頁,頁面高度固定2. 頁面根據頁數大小有不同的展示a. 只有一頁 頭部 內容 統計 尾部b. 多頁i. 第一頁 頭部 內容 尾…

UC瀏覽器PC版自2016年后未再更新不支持vue3

win uc瀏覽器,點擊頁面觸發異常。UC瀏覽器PC版自2016年后未再更新(最新版本停留在Chromium 50內核)。其內置內核版本較低(如Trident/Blink舊版),無法支持Vue 3等現代前端框架的語法特性(如ES6、…

亞古數據:澳大利亞公司的ABN和ACN號碼是什么?

在跨國商業的迷宮中,了解目標市場的公司注冊細節是一項不可或缺的技能。對于與中國企業有業務往來的朋友們來說,澳大利亞這片充滿機遇的土地上,兩個縮寫——ABN與ACN,如同解鎖合作之門的密鑰,顯得尤為重要。今天&#…

LangChain框架 Prompts、Agents 應用

目錄 (Prompts)提示作用 Prompts 常見操作 基礎 PromptTemplate 使用 Few-shot 提示模板 ChatPromptTemplate (對話提示模板) (Agents)代理作用 Agents 常見操作 基礎 Agent 使用 自定義工具 Agent 高級應用示例 帶記憶的對話代理 使用本地模型的代理 結構化輸出代…

模擬實現unordered_map

1.定義unordered_map 是 C 標準庫中的哈希表容器,特點是無序存儲、平均 O (1) 時間復雜度的插入 / 查找 / 刪除操作。其核心原理是通過哈希函數將關鍵字映射到哈希桶(bucket),再通過鏈表或紅黑樹處理哈希沖突。2.實現原理1. 哈希表…

史上最詳細Java并發多線程(面試必備,一篇足矣)

第一章:線程基礎 1.1 線程與進程 進程:系統資源分配的基本單位,擁有獨立的內存空間 線程:CPU調度的基本單位,共享進程內存空間 關系:一個進程可包含多個線程,線程切換成本遠低于進程 1.2 線程的…

【DataFlow】數據合成流水線工具

1.整體解讀 核心思想:以數據為中心的AI(Data-Centric AI) DataFlow 的核心目標是通過一系列自動化“流水線”(Pipelines)來處理和生成高質量的數據,從而提升大語言模型(LLM)在特定領…

Hangfire 調用報錯解決方案總結

System.ArgumentNullException: 值不能為 null 錯誤在使用 Hangfire 時確實是一個常見問題,特別是在配置 Hangfire 服務器時。問題分析這個錯誤通常發生在以下情況:沒有正確配置 Hangfire 服務器隊列配置缺失或不正確連接字符串配置問題解決方案要點正確…

MySQL的使用

MySQL的使用一、mysql中的周邊命令1. 檢查版本2. 查看字符集3. 查看客戶端連接4. 查看最后一條警告消息二、數據庫、數據表的管理1. 語法規則2. 數據庫2.1 查看數據庫2.2 創建數據庫2.3 選擇數據庫2.4 查看創建數據庫命令2.5 創建庫時添加字符集2.6 修改數據庫字符集2.7 刪除數…

2025Nginx最新版講解/面試

維護系統多服務器部署,將我們請求代理到各個服務器。代理正向代理,代理對象是我們的客戶端,目標對象不知道我們用戶。VPN就是典型的正向代理。反向代理,代理對象是服務端,用戶不知道服務端具體信息。而這正是Nginx所做…

JAVASCRIPT 前端數據庫-V8--仙盟數據庫架構-—-—仙盟創夢IDE

老版本 在v1 版本中我們講述了 基礎版的應用 JAVASCRIPT 前端數據庫-V1--仙盟數據庫架構-—-—仙盟創夢IDE-CSDN博客 接下載我們做一個更復雜的的其他場景 由于,V1查詢字段必須 id 接下來我們修改了了代碼 JAVASCRIPT 前端數據庫-V2--仙盟數據庫架構-—-—仙盟創…

UNIX 域套接字實現本地進程間通信

🚀 使用 UNIX 域套接字 (AF_UNIX) 實現高效進程通信 在 Linux 和其他類 UNIX 系統中,進程間通信 (IPC) 的方法有很多種,例如管道、消息隊列、共享內存等。然而,當你的應用程序需要在 同一臺機器上的不同進程間進行高效、低延遲的數…

【Axure教程】中繼器間圖片的傳遞

中繼器在Axure中可以作為圖片保存的數據庫,在實際系統中,我們經常需要將選擇數據庫的圖片添加到其他圖片列表中,所以今天就教大家,怎么在Axure中實現中繼器之間的圖片傳遞,包含將一個中繼器中的圖片列表傳遞到另一個中…

專題:2025云計算與AI技術研究趨勢報告|附200+份報告PDF、原數據表匯總下載

原文鏈接:https://tecdat.cn/?p42935 關鍵詞:2025, 云計算,AI 技術,市場趨勢,深度學習,公有云,研究報告 云計算和 AI 技術正以肉眼可見的速度重塑商業世界。過去十年,全球云服務收…

從代碼學習深度強化學習 - PPO PyTorch版

文章目錄 前言PPO 算法簡介從 TRPO 到 PPOPPO 的兩種形式:懲罰與截斷代碼實踐:PPO 解決離散動作空間問題 (CartPole)環境與工具函數定義策略與價值網絡PPO 智能體核心實現訓練與結果代碼實踐:PPO 解決連續動作空間問題 (Pendulum)環境準備適用于連續動作的網絡PPO 智能體 (連…

PortsWiggerLab: Blind OS command injection with output redirection

實驗目的This lab contains a blind OS command injection vulnerability in the feedback function.The application executes a shell command containing the user-supplied details. The output from the command is not returned in the response. However, you can use o…

星云穿越與超光速飛行特效的前端實現原理與實踐

文章目錄 1,引言2,特效設計思路3,技術原理解析1. 星點的三維分布2. 視角推進與星點運動3. 三維到二維的投影4. 星點的視覺表現5. 色彩與模糊處理4,關鍵實現流程圖5,應用場景與優化建議6,總結1,引言 在現代網頁開發中,炫酷的視覺特效不僅能提升用戶體驗,還能為產品增添…

【Linux】C++項目分層架構:核心三層與關鍵輔助

C 項目分層架構全指南:核心三層 關鍵輔助一、核心三層架構 傳統的三層架構(或三層體系結構)是構建健壯系統的基石,包括以下三層: 1. 表現層(Presentation Layer) 負責展示和輸入處理&#xff0…

【機器學習】保序回歸平滑校準算法

保序回歸平滑校準算法(SIR)通過分桶合并線性插值解決廣告預估偏差問題,核心是保持原始排序下糾偏。具體步驟:1)按預估分升序分桶,統計每個分桶的后驗CTR;2)合并逆序桶重新計算均值&a…