【Qt】界面布局

Qt常用布局

除Qt Designer支持可視化設計和布局界面之外,Qt 提供了代碼方式來進行界面布局,

以下是幾種常用的界面布局方式:

  1. 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout):

    • QHBoxLayout和QVBoxLayout分別用于水平和垂直方向上的布局。你可以將QWidget添加到這些布局中,并設置伸展因子(stretch factor)、對齊方式(alignment)、間距(spacing)等。這兩種布局是最常見的布局方式,而且效果很好。
  2. 柵格布局(QGridLayout):

    • QGridLayout允許你以行和列的方式來進行布局。你可以指定每個控件所在的行、列以及占據的行數和列數,從而創建一個網格狀的布局。
  3. 表單布局(QFormLayout):

    • QFormLayout是用于表單輸入的布局管理器,它將標簽和輸入控件成對地進行布局,非常適合用于輸入表單等場景。
  4. 堆疊布局(QStackedLayout):

    • QStackedLayout可以讓你在同一個空間內進行多個頁面或控件的切換,只顯示其中一個控件,常用于實現向導式的頁面切換功能。
  5. 網格網格包布局(QGridLayout):

    • QGridLayout 是一個靈活的網格布局,可以非常精確地控制控件的位置以及跨度。

通過合理地選擇和使用這些不同類型的布局管理器,可以很方便地實現界面的布局,并且能夠很好地適應不同的窗口大小和語言環境。

Qt的UI設計器很方便,為什么還要手寫代碼?

  1. 定制化需求: UI設計器可以滿足許多通用的布局和控件需求,但是當你有一些特殊的、定制化的界面需求時,有時候需要通過手寫代碼來實現更靈活的布局和交互效果。

  2. 動態創建界面: 當需要動態地在程序運行時創建或修改界面元素時,代碼創建界面會更為方便。有時候一個界面的布局需要根據數據或其他條件來動態調整,這時候手寫代碼比可視化界面更靈活。

  3. 復雜邏輯: 一些復雜的界面邏輯、事件處理、動畫效果等可能很難通過UI設計器的可視化工具直接實現,這時候手寫代碼將更為方便。

  4. 團隊協作: 在團隊協作中,有時候為了維護代碼的一致性和可讀性,團隊可能會選擇采用手寫代碼的方式來創建界面。

雖然UI設計器提供了很多便利,但是它并不能完全替代手寫代碼。在實際的軟件開發過程中,通常會結合使用UI設計器和手寫代碼的方式,根據實際需求來選擇合適的方式來構建界面。

水平布局

水平布局頭文件:#include <QHBoxLayout>
創建水平布局:QHBoxLayout *layout = new QHBoxLayout(父窗口指針);

布局相關方法:

  • addWidget:在布局里添加一個控件
  • addLayout:在布局里添加布局
  • setMargin(int margin):設置布局與其包含的控件之間的間距。
  • setSpacing(int spacing):設置布局內部控件之間的間距(spacing)。
  • addSpacing(int spacing):向布局中添加一個指定寬度的空白區域。
  • addStretch(int stretch = 0):向布局中添加一個伸展因子(stretch factor)。

下面是一個簡單的介紹如何在Qt中創建水平布局的步驟:

步驟1:包含必要的頭文件

#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>

步驟2:創建父級QWidget

QWidget *parentWidget = new QWidget;

步驟3:創建要放入水平布局中的控件

QLabel *label = new QLabel("Name:");
QLineEdit *lineEdit = new QLineEdit();
QPushButton *button = new QPushButton("Submit");

步驟4:創建水平布局并將控件添加到布局中

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(lineEdit);
layout->addWidget(button);

步驟5:將水平布局設置為父級QWidget的布局

parentWidget->setLayout(layout);

以上成功創建了一個包含標簽、文本框和按鈕的水平布局。當將父QWidget放置在窗口或另一個布局管理器中時,水平布局將會被正確顯示。

需要注意的是,在把控件加入到布局中時,它們會按加入的順序從左至右進行排列。如果窗口大小不夠大,控件可能會被擠到下一行。這時候可以設置伸展因子使得布局更靈活。

豎直布局

豎直布局頭文件:#include <QVBoxLayout>
創建豎直布局:QVBoxLayout *layout = new QVBoxLayout(父窗口指針);

下面是一個簡單的介紹如何在Qt中創建豎直布局的步驟:

步驟1:包含必要的頭文件

#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>

步驟2:創建父級QWidget

QWidget *parentWidget = new QWidget;

步驟3:創建要放入豎直布局中的控件

QLabel *label1 = new QLabel("Name:");
QLineEdit *lineEdit1 = new QLineEdit();
QLabel *label2 = new QLabel("Email:");
QLineEdit *lineEdit2 = new QLineEdit();
QPushButton *button = new QPushButton("Submit");

步驟4:創建豎直布局并將控件添加到布局中

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(label1);
layout->addWidget(lineEdit1);
layout->addWidget(label2);
layout->addWidget(lineEdit2);
layout->addWidget(button);

步驟5:將豎直布局設置為父級QWidget的布局

parentWidget->setLayout(layout);

以上成功創建了一個包含標簽、文本框和按鈕的豎直布局。當將父QWidget放置在窗口或另一個布局管理器中時,豎直布局將會被正確顯示。

與水平布局類似,也可以使用一些布局的方法來調整外邊距、內部空白和添加伸展因子等。

柵格布局

使用QGridLayout來創建柵格布局,該布局將控件放置在一個二維網格內,使其在行和列中對齊。

水平布局頭文件:#include <QGridLayout>
創建水平布局:QGridLayout* layout = new QGridLayout(父窗口指針);
添加控件:addWidget()
添加布局:addLayout()
設置水平間距:setHorizontalSpacing()
設置垂直間距:setVerticalSpacing()

以下是一個簡單的介紹如何在Qt中創建柵格布局的步驟:

步驟1:包含必要的頭文件

#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>

步驟2:創建父級QWidget

QWidget *parentWidget = new QWidget;

步驟3:創建要放入柵格布局中的控件

QLabel *label1 = new QLabel("Name:");
QLineEdit *lineEdit1 = new QLineEdit();
QLabel *label2 = new QLabel("Email:");
QLineEdit *lineEdit2 = new QLineEdit();
QPushButton *button = new QPushButton("Submit");

步驟4:創建柵格布局并將控件添加到布局中

QGridLayout *layout = new QGridLayout;
layout->addWidget(label1, 0, 0);  // 將 label1 放在第 0 行、第 0 列
layout->addWidget(lineEdit1, 0, 1); // 將 lineEdit1 放在第 0 行、第 1 列
layout->addWidget(label2, 1, 0); // 將 label2 放在第 1 行、第 0 列
layout->addWidget(lineEdit2, 1, 1); // 將 lineEdit2 放在第 1 行、第 1 列
layout->addWidget(button, 2, 0, 1, 2); // 將 button 放在第 2 行、第 0 列,并且占據2列

步驟5:將柵格布局設置為父級QWidget的布局

parentWidget->setLayout(layout);

以上創建了一個包含標簽、文本框和按鈕的柵格布局。當將父QWidget放置在窗口或另一個布局管理器中時,柵格布局將會被正確顯示。

柵格布局允許在行和列中對齊控件,并支持控件占據多個單元格。

分裂器布局

在Qt中,可以使用QSplitter類來創建分隔布局,這允許用戶在窗口內部拖動分隔器來改變子控件的大小。這對于需要動態調整子控件大小的應用程序非常有用。

下面是一個簡單的介紹,介紹如何在Qt中創建一個分隔器布局:

步驟1:需要包含必要的頭文件:

#include <QSplitter>
#include <QLabel>
#include <QTextEdit>

步驟2:使用QSplitter類來創建一個分隔器布局,并將要放置在其中的控件添加到分隔器中。

QSplitter *splitter = new QSplitter(Qt::Horizontal); // 創建一個水平分隔器QLabel *label = new QLabel("Left Panel"); // 創建一個標簽
QTextEdit *textEdit = new QTextEdit(); // 創建一個文本編輯框splitter->addWidget(label); // 將標簽放入分隔器中
splitter->addWidget(textEdit); // 將文本編輯框放入分隔器中

步驟3:將分隔器布局放入窗口的布局中,或者將其設置為窗口的主布局,以便在應用程序中顯示出來。

QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(splitter);
setLayout(mainLayout);

以上,當運行應用程序時,會看到一個可以拖動的分隔器,用來調整左側和右側控件的大小。

使用QSplitter可以輕松地創建分隔布局,使得窗口中的控件可以以用戶友好的方式進行動態調整大小。

布局刪除重構

在Qt中,對于已經創建的布局,如果想要刪除并重構它們,可以采取以下步驟:

  1. 刪除布局:首先,需要從父級QWidget中刪除已經存在的布局。

假設有一個布局對象 layout,可以使用以下代碼將其從父級QWidget中刪除:

QWidget *parentWidget = ...; // 獲取父級QWidget的指針
delete parentWidget->layout(); // 刪除父級QWidget上的布局
  1. 清理子控件:在刪除布局之后,需要清理掉所有在該布局中的子控件,以確保不會留下任何殘余。
QLayout *layout = parentWidget->layout(); // 獲取父級QWidget上的布局
QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) { // 逐個刪除布局中的子控件delete child->widget(); // 刪除子控件delete child; // 釋放子控件所占用的內存
}
  1. 重新構建布局:將刪除的布局替換為新的布局。
QVBoxLayout *newLayout = new QVBoxLayout; // 創建一個新的垂直布局
// 添加控件到新布局中
newLayout->addWidget(new QPushButton("New Button"));
newLayout->addWidget(new QLabel("New Label"));
// 將新布局設置為父級QWidget的布局
parentWidget->setLayout(newLayout);

通過上述步驟,可以將現有布局刪除并重構為一個全新的布局。這在某些情況下是非常有用的,尤其是在需要動態調整界面布局的情況下。

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

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

相關文章

Redis常用數據結構--Zset

Zset ZADDZCARDZCOUNTZRANGE/ZREVRANGEZRANGEBYSCOREZPOPMAX/ZPOPMINBZPOPMAX/BZPOPMINZRANK/ZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBYZINTERSTORE/ZUNIONSTORE內部編碼使?場景 ZADD 添加或者更新指定的元素以及關聯的分數到 zset 中&#xff0c;分數應該符…

如何在 Angular 測試中使用 spy

簡介 Jasmine spy 用于跟蹤或存根函數或方法。spy 是一種檢查函數是否被調用或提供自定義返回值的方法。我們可以使用spy 來測試依賴于服務的組件&#xff0c;并避免實際調用服務的方法來獲取值。這有助于保持我們的單元測試專注于測試組件本身的內部而不是其依賴關系。 在本…

空調壓縮機補充潤滑油的方法

空調壓縮機補充潤滑油的方法有三種&#xff0c;從吸氣截止閥旁邊通孔吸入&#xff0c;從加油孔中加入&#xff0c;從曲軸箱下部加入&#xff0c;具體操作步驟如下&#xff1a; 1關閉吸氣截止閥&#xff0c;啟動壓縮機幾分鐘&#xff0c;將曲軸箱中制冷劑排入冷凝器&#xff0c…

vue2結合electron開發桌面端應用

一、Electron是什么&#xff1f; Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面應用程序的框架。 嵌入 Chromium 和 Node.js 到 二進制的 Electron 。允許您保持一個 JavaScript 代碼代碼庫并創建可在Windows、macOS和Linux上運行的跨平臺應用 。 Electron 經常與 Ch…

scrapy 中間件

就是發送請求的時候&#xff0c;會經過&#xff0c;中間件。中間件會處理&#xff0c;你的請求 下面是代碼&#xff1a; # Define here the models for your spider middleware # # See documentation in: # https://docs.scrapy.org/en/latest/topics/spider-middleware.html…

【快速上手ProtoBuf】基本使用

文章目錄 1 :peach:初識 ProtoBuf:peach:1.1 :apple:序列化概念:apple:1.2 :apple:ProtoBuf 是什么:apple:1.3 :apple:ProtoBuf 的使用特點:apple: 2 :peach:創建 .proto ?件:peach:3 :peach:編譯 .proto 文件:peach:3 :peach:序列化與反序列化的使用:peach: 1 &#x1f351;初…

洛谷 2036.PERKET

采用遞歸法的方式進行題解。 思路&#xff1a;首先我們知道在n種材料當中&#xff0c;我們需要從中選擇至少有一種得配料才行。也就是說&#xff0c;我們選擇的配料數目是自己決定的&#xff0c;而不是那種組合型得對于你有要求的組合型遞歸方式。 所以我們會想到用指數型得遞…

(五)網絡優化與超參數選擇--九五小龐

網絡容量 網絡中神經單元數越多&#xff0c;層數越多&#xff0c;神經網路的擬合能力越強。但是訓練速度&#xff0c;難度越大&#xff0c;越容易產生過擬合。 如何選擇超參數 所謂超參數&#xff0c;也就是搭建神經網路中&#xff0c;需要我們自己去選擇&#xff08;不是通…

LeetCode 刷題 [C++] 第45題.跳躍游戲 II

題目描述 給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。 每個元素 nums[i] 表示從索引 i 向前跳轉的最大長度。換句話說&#xff0c;如果你在 nums[i] 處&#xff0c;你可以跳轉到任意 nums[i j] 處: 0 < j < nums[i]i j < n 返回到達 nums[n …

遞歸函數(c++題解)

題目描述 對于一個遞歸函數w(a, b, c)。 如果a < 0 or b < 0 or c < 0就返回值1。 如果a > 20 or b > 20 or c > 20就返回W(20,20,20)。 如果a < b并且b < c 就返回w(a, b, c ? 1) w(a, b ? 1, c ? 1) ? w(a, b ? 1, c)&#xff0c; 其它別…

計算機網絡知多少-第1篇

一、 從輸入URL到頁面展示到底發生了什么&#xff1f; 1. 首先瀏覽器會查看電腦本地緩存&#xff0c;如果有直接返回&#xff0c;否則需要進行下一步的網絡請求。 2. 在網絡請求之前&#xff0c;需要先進行DNS解析&#xff0c;來找到請求域名的ip地址。如果是HTTPS請求&#…

【C語言】熟悉文件基礎知識

歡迎關注個人主頁&#xff1a;逸狼 創造不易&#xff0c;可以點點贊嗎~ 如有錯誤&#xff0c;歡迎指出~ 文件 為了數據持久化保存&#xff0c;使用文件&#xff0c;否則數據存儲在內存中&#xff0c;程序退出&#xff0c;內存回收&#xff0c;數據就會丟失。 程序設計中&…

微信小程序,h5端自適應登陸方式

微信小程序端只顯示登陸(獲取opid),h5端顯示通過賬戶密碼登陸 例如: 通過下面的變量控制: const isWeixin ref(false); // #ifdef MP-WEIXIN isWeixin.value true; // #endif

Git 查看提交歷史

命令說明git log查看歷史提交記錄git blame (file)以列表形式查看指定文件的歷史修改記錄 git log 在使用 Git 提交了若干更新之后&#xff0c;又或者克隆了某個項目&#xff0c;想回顧下提交歷史&#xff0c;我們可以使用 git log 命令查看。 git log 命令用于查看 Git 倉庫中…

LIN基礎:從LIN Frame開始

目錄&#xff1a; 1、LIN的網絡拓撲 2、LIN Frame 1&#xff09;Header 2&#xff09;Response 3、LIN的通信規則 1&#xff09;LIN的發送行為示例 2&#xff09;LIN的接收行為示例 雖然LIN總線的通信速率不高&#xff0c;工程中&#xff0c;最高的速率也就19200bps。…

c語言extern關鍵字

extern 是C和C中的關鍵字&#xff0c;用于聲明一個變量或函數的存在&#xff0c;但不進行定義。 它通常用于在一個源文件中引用另一個源文件中定義的變量或函數。 例如&#xff0c;extern int x; 表示 x 是一個整數變量&#xff0c;但它的實際定義將在其他文件中。在引用它的文…

StarRocks——Stream Load 事務接口實現原理

目錄 前言 一、StarRocks 數據導入 二、StarRocks 事務寫入原理 三、InLong 實時寫入StarRocks原理 3.1 InLong概述 3.2 基本原理 3.3 詳細流程 3.3.1 任務寫入數據 3.3.2 任務保存檢查點 3.3.3 任務如何確認保存點成功 3.3.4 任務如何初始化 3.4 Exactly Once 保證…

Leetcode - 周賽386

目錄 一&#xff0c;3046. 分割數組 二&#xff0c;3047. 求交集區域內的最大正方形面積 三&#xff0c;3048. 標記所有下標的最早秒數 I 四&#xff0c;3049. 標記所有下標的最早秒數 II 一&#xff0c;3046. 分割數組 將題目給的數組nums分成兩個數組&#xff0c;且這兩個…

探索RedisJSON:將JSON數據力量帶入Redis世界

探索RedisJSON&#xff1a;將JSON數據力量帶入Redis世界 當我們談論數據存儲和查詢時&#xff0c;Redis和JSON都是無法忽視的重要角色。Redis以其高效的鍵值存儲、快速的讀/寫速度、以及豐富的數據結構贏得了開發者的喜愛。而JSON&#xff0c;作為一種輕量級的數據交換格式&am…

「Vue3系列」Vue3 條件語句/循環語句

文章目錄 一、Vue3 條件語句1. v-if2. v-else-if 和 v-else3. v-show4. 使用計算屬性進行條件渲染5. v-if與v-show比較v-ifv-show性能考慮使用場景 二、Vue3 循環語句1. 遍歷數組2. 遍歷對象3. 使用索引4. 注意事項 三、相關鏈接 一、Vue3 條件語句 在 Vue 3 中&#xff0c;你…