QT6 源(45):分隔條 QSplitter 允許程序的用戶修改布局,程序員使用 IDE時,就是分隔條的用戶,以及其 QSplitter 源代碼

(1)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

(2)本類的繼承關系如下,所以說分隔條屬于容器

在這里插入圖片描述

(3)本類的屬性

在這里插入圖片描述

(4) 這是一份 QSplitter 的舉例代碼,注意其構造函數時候的傳參

#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QFrame>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QHBoxLayout * horizontalLayout;QSplitter   * splitter;QFrame      * frame;QFrame      * frame_2;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName(QString::fromUtf8("Widget"));Widget->resize(523, 339);horizontalLayout = new QHBoxLayout(Widget); //為主窗體采用水平布局horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));splitter = new QSplitter(Widget); //對,生成的是水平分隔條。本分割條屬于本窗體容器。splitter->setObjectName(QString::fromUtf8("splitter"));splitter->setOrientation(Qt::Horizontal);frame = new QFrame(splitter);frame->setObjectName(QString::fromUtf8("frame"));frame->setFrameShape(QFrame::StyledPanel);frame->setFrameShadow(QFrame::Plain);frame->setLineWidth(2);splitter->addWidget(frame); //把左 frame 添加入 splitter//繼承關系上, splitter 才擴充了添加窗體的方法frame_2 = new QFrame(splitter);frame_2->setObjectName(QString::fromUtf8("frame_2"));frame_2->setFrameShape(QFrame::StyledPanel);frame_2->setFrameShadow(QFrame::Plain);frame_2->setLineWidth(2);splitter->addWidget(frame_2); //把右 frame 添加入 splitterhorizontalLayout->addWidget(splitter); //把分隔條 splitter 添加到主窗體的布局中//可見,分隔條相當于容器,隱身的容器;也相當于布局,可以接收子容器,還可以被放入布局中retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

(5)給出源代碼,來自于頭文件 qsplitter . h

#ifndef QSPLITTER_H
#define QSPLITTER_H#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qframe.h>
#include <QtWidgets/qsizepolicy.h>/*
QT_CONFIG宏實現了對 Qt特性的安全編譯時檢查。特性可以處于三種狀態:
0 或未定義:在測試時會引發編譯錯誤
-1:該功能不可用
1:該功能可用The QT_CONFIG macro implements a safe compile time check for features of Qt.Features can be in three states:0 or undefined: This will lead to a compile error when testing for it-1: The feature is not available1: The feature is available
*/
#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)#define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1,\"Required feature " #feature " for file " __FILE__ " not available.")QT_REQUIRE_CONFIG(splitter); //條件編譯,確保有了此源代碼模塊QT_BEGIN_NAMESPACE  //說明本類定義在 QT 的全局空間class QSplitterPrivate;
class QTextStream;class QSplitterHandle;//    class QLayout : public QObject, public QLayoutIte
//    class QWidget : public QObject, public QPaintDevice
//class QFrame : public QWidget
//一個分割器允許用戶通過拖動它們之間的邊界來控制子控件的大小。
//任何數量的控件都可以由一個單一的分割器控制。
//如果在調用 insertWidget()或addWidget()時,一個部件已經在 QSplitter中,
//它將移動到新位置。這可以用于稍后重新排序 splitter中的部件。
//可以使用indexOf()、widget()和count()來訪問splitter 中的部件。
//默認的QSplitter將其子元素水平排列(并排);
//您可以使用setOrientation(Qt::Vertical)將其子元素垂直排列。
//默認情況下,所有小部件都可以像用戶希望的那樣大或小,
//介于小部件的minimumSizeHint()(或minimumSize())和maximumSize()之間。
//默認情況下,QSplitter會動態調整其子項的大小。
//如果您希望QSplitter僅在調整大小操作結束時調整子項的大小,請調用setOpaqueResize(false)。
//小部件之間初始大小的分布是通過將初始大小與拉伸因子相乘來確定的。
//您還可以使用setSizes()來設置所有小部件的大小。函數sizes()返回由用戶設置的大小。
//或者,您可以使用saveState()和restoreState()分別保存和恢復小部件的大小。
//當你隱藏(hide)一個子元素時,它的空間將被分配到其他子元素中。當你再次顯示(show)它時,它將被恢復。
class Q_WIDGETS_EXPORT QSplitter : public QFrame
{Q_OBJECT //又插入了此宏//此屬性保存了分割器的方向.//默認情況下,方向是水平(即小部件是并排排列的)。可能的方向是Qt::Horizontal和Qt::Vertical。Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)//如果分隔條在交互式移動時動態(不透明)地重新調整大小,則返回true。否則返回 false。//默認的縮放行為取決于樣式(由SH_Splitter_OpaqueResize樣式提示確定)。//但是,您可以通過調用setOpaqueResize()來覆蓋它。Q_PROPERTY(bool opaqueResize READ opaqueResize WRITE setOpaqueResize)//不透明//此屬性包含分隔符手柄的寬度。即被分隔條隔開的內部各控件之間的間距。//默認情況下,此屬性包含一個值,該值取決于用戶的平臺和樣式偏好。//如果您將 handleWidth 設置為1或0,則實際抓取區域將增長到與其各自的小部件重疊幾個像素Q_PROPERTY(int handleWidth READ handleWidth WRITE setHandleWidth)//這個屬性表示子控件是否可以被用戶縮小到0的大小。默認情況下,子元素是可折疊的。//使用setCollapsible()方法可以啟用或禁用單個子元素的折疊。Q_PROPERTY(bool childrenCollapsible //倒塌;垮塌;可折疊 collapseREAD childrenCollapsible WRITE setChildrenCollapsible)private:Q_DISABLE_COPY(QSplitter)Q_DECLARE_PRIVATE(QSplitter)
private:friend class QSplitterHandle;public://構造一個水平分割器,將 parent參數傳遞給 QFrame構造函數。explicit QSplitter(QWidget * parent = nullptr); //本組件屬于 parent容器explicit QSplitter(Qt::Orientation, QWidget * parent = nullptr);//Constructs a splitter with the given orientation and parent.~QSplitter();//Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)Qt::Orientation orientation() const;void         setOrientation(Qt::Orientation); //方向就是水平或垂直兩種//Q_PROPERTY(bool opaqueResize READ opaqueResize WRITE setOpaqueResize)bool    opaqueResize() const;void setOpaqueResize(bool opaque = true);//Q_PROPERTY(int handleWidth READ handleWidth WRITE setHandleWidth)int     handleWidth() const;void setHandleWidth(int);//Q_PROPERTY(bool childrenCollapsible
//           READ childrenCollapsible WRITE setChildrenCollapsible)bool    childrenCollapsible() const;void setChildrenCollapsible(bool);//Returns true if the widget at index is collapsible, otherwise returns false.bool  isCollapsible(int index) const;void setCollapsible(int index, bool);//Sets whether the child widget at index is collapsible to collapse.//默認情況下,子項是可折疊的,這意味著用戶可以將它們的大小縮小到大小0,//即使它們具有非零的minimumSize()或minimumSizeHint()。//可以通過調用此函數在每個 widget的基礎上更改此行為,//也可以通過設置 childrencollapsible 屬性為拆分器中的所有 widget 全局更改此行為。//返回此拆分器中所有小部件的大小參數的列表。//如果拆分器的方向是水平,則列表包含從左到右的像素寬度;//如果方向是垂直的,則列表包含從頂部到底部的像素高度。//將值傳遞給另一個分塊器的 setSizes()函數將產生一個布局與此相同的分塊器。QList<int>   sizes() const; //本函數的返回值是一個鏈表容器void      setSizes(const QList<int> &list);//將子控件的相應大小設置為列表中給出的值。//如果分隔線是水平的,則值以像素為單位設置每個小部件的寬度,從左到右。//如果分隔線是垂直的則設置每個小部件的高度,從上到下。//列表中的額外值將被忽略。如果列表包含太少的值,結果是不確定的,但程序仍然會表現得很好。//分割器組件的整體大小不受影響。相反,任何額外的/缺失的空間將根據尺寸的相對權重在組件之間分配。//如果您指定大小為0,則小部件將不可見。//小部件的大小策略將被保留。也就是說小于相應小部件的最小大小提示值的值將被提示值替換。//保存分割器的布局狀態。//通常,這用于與QSettings一起使用,以記住未來會話的大小。版本號作為數據的一部分存儲。QByteArray    saveState() const;bool       restoreState(const QByteArray &state);//Restores the splitter's layout to the state specified.//Returns true if the state is restored; otherwise returns false.QSize        sizeHint() const override;QSize minimumSizeHint() const override;//Returns the valid range of the splitter at index in *min and *max//if min and max are not 0.void getRange(int index, int *min, int *max) const;//Returns the number of widgets contained in the splitter's layout.int count() const;int indexOf(QWidget *w) const;QWidget *        widget(int index) const; //!!擴充了添加窗體的方法,就類似于 Qlayout了void          addWidget(QWidget *widget);void       insertWidget(int index, QWidget *widget);QWidget * replaceWidget(int index, QWidget *widget);void refresh(); //不要調用本函數//Updates the splitter's state. You should not need to call this function.//Updates the size policy of the widget at position index to//have a stretch factor of stretch.//stretch 并不是有效的拉伸因子;有效的拉伸因子是通過取小部件的初始大小并//將其乘以 stretch 計算得出的  。void setStretchFactor(int index, int stretch);//返回分割器布局中給定索引處左側(或上方)的項的句柄,//如果不存在這樣的項則返回nullptr。索引為0的句柄總是隱藏的。//對于像阿拉伯語和希伯來語這樣的右至左語言,水平分隔符的布局是顛倒的。在索引處的控件右側是手柄。QSplitterHandle         *       handle(int index) const;
protected:virtual QSplitterHandle * createHandle();//返回一個新的分隔符處理程序作為此分隔符的子控件。//此函數可以在子類中重新實現,以提供對自定義處理程序的支持。bool       event(QEvent *) override;void  childEvent(QChildEvent *) override;void resizeEvent(QResizeEvent *) override;void changeEvent(QEvent *) override;//在位置 pos 顯示橡皮筋 RubberBand。如果 pos是負數,則移除皮筋。void setRubberBand(int position);int  closestLegalPosition(int pos, int index);//Returns the closest legal position to pos of the widget at index.//對于阿拉伯語和希伯來語等從右向左的語言,水平分隔符的布局//是顛倒的。然后從小部件的右邊緣測量位置。//將分割器手柄的左邊緣或頂部邊緣在索引 index 處移動到盡可能靠近位置pos的位置,//位置pos是從小部件的左邊緣或頂部邊緣的距離。void moveSplitter(int pos, int index);Q_SIGNALS: //信號函數void     splitterMoved(int pos, int index);//當 index 索引處的分路器手柄移動到位置 pos 時,會發出此信號。
}; //完結 class QSplitter : public QFrameclass QSplitterHandlePrivate;//當人們想到分割器時,通常會想到QSplitterHandle。它是用于調整部件大小的控制柄。
//使用 QSplitter的典型開發人員永遠不必擔心 QSplitterHandle。
//它提供給那些想要提供額外功能(如彈出菜單)的分割器處理程序的開發人員。
//創建分割器處理程序的典型方法是子類化QSplitter,然后重寫QSplitter::createHandle()以
//實例化自定義分割器處理程序。
class Q_WIDGETS_EXPORT QSplitterHandle : public QWidget
{Q_OBJECT
public:explicit QSplitterHandle(Qt::Orientation o, QSplitter *parent);~QSplitterHandle();void setOrientation(Qt::Orientation o);Qt::Orientation orientation() const;bool opaqueResize() const;QSplitter *splitter() const;QSize sizeHint() const override;protected:void paintEvent(QPaintEvent *) override;void mouseMoveEvent(QMouseEvent *) override;void mousePressEvent(QMouseEvent *) override;void mouseReleaseEvent(QMouseEvent *) override;void resizeEvent(QResizeEvent *) override;bool event(QEvent *) override;void moveSplitter(int p);int closestLegalPosition(int p);private:Q_DISABLE_COPY(QSplitterHandle)Q_DECLARE_PRIVATE(QSplitterHandle)
};QT_END_NAMESPACE#endif // QSPLITTER_H

(6)

謝謝

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

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

相關文章

VSCode PIO使用Jlink SWD燒錄Stm32

一、背景 PIO的編譯速度比Arduino快很多&#xff0c;同樣支持Arduino的語法。VScode的自動補全和插件也能夠幫助快速開發目前使用JLINK SWD的方式連接STM32 二、配置 在ini配置文件中&#xff0c;添加如下內容 [env:genericSTM32F103C8] platform ststm32 board genericS…

JavaScript 渲染內容爬取:Puppeteer 入門

在現代網絡應用中&#xff0c;許多網頁內容是通過 JavaScript 渲染生成的&#xff0c;傳統的爬蟲工具往往難以獲取這些動態內容。Puppeteer 作為一種強大的瀏覽器自動化工具&#xff0c;為這一問題提供了優雅的解決方案。本文將帶你入門 Puppeteer&#xff0c;介紹如何安裝、啟…

卷積神經網絡:視覺煉金術士的數學魔法

引言&#xff1a;當數學遇見視覺煉金術 在人工智能的奇幻世界里&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;猶如掌握視覺奧秘的煉金術士&#xff0c;將原始像素的"鉛塊"淬煉成認知的"黃金"。這種融合數學嚴謹性與生物靈感的算法架構&#xff0c…

Android Cordova 開發 - Cordova 快速入門(Cordova 環境配置、Cordova 第一個應用程序)

一、Cordova 1、Cordova 概述 Cordova 是使用 HTML&#xff0c;CSS 和 JavaScript 構建混合移動應用程序的平臺 2、Cordova 特征 &#xff08;1&#xff09;命令行界面&#xff08;Cordova CLI&#xff09; 這是可用于啟動項目&#xff0c;構建不同平臺的進程&#xff0c;…

ubuntu18.04啟動不了修復

參考: 虛擬機里的Ubuntu18.4啟動時進入到grub rescue救援模式&#xff08;無法正常進入到系統&#xff09;&#xff0c;ls查看后只有一個硬盤和分區&#xff0c;且無法找到/boot/grub文件【已解決】_ubuntu grub rescue-CSDN博客 本人fdisk錯誤使用,導致了grub啟動不了 第一步…

SpringBoot3設置maven package直接打包成二進制可執行文件

注意事項 SpringBoot普通native打包順序clean compile spring-boot:process-aot native:compile 使用以下配置只會的打包順序clean package&#xff08;注意&#xff1a;使用此配置以后打包會有編譯后的class文件、jar包、original源文件、二進制可執行文件【Linux是無后綴的包…

【華為】防火墻雙擊熱備-之-主備模式-單外網線路

FW1和FW2的業務接口都工作在三層&#xff0c;上行連接二層交換機。上行交換機連接運營商的接入點&#xff0c;運營商為企業分配的IP地址為100.100.100.2。現在希望FW1和FW2以主備備份方式工作。正常情況下&#xff0c;流量通過FW1轉發&#xff1b;當FW1出現故障時&#xff0c;流…

MYSQL之表的操作

1. 創建表 語法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 engine 存儲引擎; field 表示列名, datatype 表示列的類型character set 字符集, 如果沒有指定字符集, 則以所在數據庫的字符集為…

RAG進階:Chroma開源的AI原生向量數據庫

一、Chroma 核心概念與優勢 1. 什么是 Chroma&#xff1f; Chroma 是一款開源的向量數據庫&#xff0c;專為高效存儲和檢索高維向量數據設計。其核心能力在于語義相似性搜索&#xff0c;支持文本、圖像等嵌入向量的快速匹配&#xff0c;廣泛應用于大模型上下文增強&#xff0…

店匠科技摘得 36 氪“2025 AI Partner 創新大獎”

全場景 AI 方案驅動跨境電商數智化躍遷 4 月 18 日,36 氪 2025 AI Partner 大會于上海盛大開幕。大會緊扣“Super App 來了”主題,全力探尋 AI 時代的全新變量,探索 AI 領域下一個超級應用的無限可能性。在此次大會上,跨境電商獨立站 SaaS 平臺店匠科技(Shoplazza)憑借“店匠跨…

SQL技術終極指南:從內核原理到超大規模應用

一、DDL核心應用場景與最佳實踐 1.1 表結構設計場景矩陣 業務場景核心語法要素典型實現案例電商用戶畫像JSON字段虛擬列索引CREATE TABLE users (id INT, profile JSON, AS (profile->>$.age) VIRTUAL, INDEX idx_age((profile->>$.age)))物聯網時序數據分區表壓…

吳恩達深度學習作業CNN之ResNet實現(Pytorch)

課程中認識許多CNN架構。首先是經典網絡&#xff1a; LeNet-5AlexNetVGG 之后是近年來的一些網絡&#xff1a; ResNetInceptionMobileNet 經典網絡 LeNet-5 LeNet-5是用于手寫數字識別&#xff08;識別0~9的阿拉伯數字&#xff09;的網絡。它的結構如下&#xff1a; 網絡…

FPGA入門學習Day1——設計一個DDS信號發生器

目錄 一、DDS簡介 &#xff08;一&#xff09;基本原理 &#xff08;二&#xff09;主要優勢 &#xff08;三&#xff09;與傳統技術的對比 二、FPGA存儲器 &#xff08;一&#xff09;ROM波形存儲器 &#xff08;二&#xff09;RAM隨機存取存儲器 &#xff08;三&…

SqlSugar與Entity Framework (EF)的SWOT分析

以下是基于 SWOT 分析法 對 SqlSugar 和 Entity Framework (EF) 的特性對比&#xff1a; SqlSugar 優勢 (Strengths) 高性能&#xff1a; SqlSugar 以輕量化設計著稱&#xff0c;執行速度更快&#xff0c;適合對性能要求較高的場景。在大數據量操作和復雜查詢中表現優異。 易…

學習記錄:DAY16

Maven 進階與前端實戰 前言 二輪考核的內容下來了&#xff0c;由整體項目構建轉為實現特定模塊的功能。對細節的要求更高了&#xff0c;而且有手搓線程池、手搓依賴注入等進階要求&#xff0c;又有得學力。嘻嘻&#xff0c;太簡單了&#xff0c;只要我手搓 Spring Boot 框架……

深度學習--卷積神經網絡調整學習率

文章目錄 前言一、學習率1、什么學習率2、什么是調整學習率3、目的 二、調整方法1、有序調整1&#xff09;有序調整StepLR(等間隔調整學習率)2&#xff09;有序調整MultiStepLR(多間隔調整學習率)3&#xff09;有序調整ExponentialLR (指數衰減調整學習率)4&#xff09;有序調整…

【消息隊列RocketMQ】四、RocketMQ 存儲機制與性能優化

一、RocketMQ 存儲機制詳解 1.1 存儲文件結構? RocketMQ 的存儲文件主要分布在store目錄下&#xff0c;該目錄是在broker.conf配置文件中通過storePathRootDir參數指定的&#xff0c;默認路徑為${user.home}/store 。主要包含以下幾種關鍵文件類型&#xff1a;? 1.1.1 Comm…

C++入門小館: 探尋vector類

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

CSS-跟隨圖片變化的背景色

CSS-跟隨圖片變化的背景色 獲取圖片的主要顏色并用于背景漸變需要安裝依賴 colorthief獲取圖片的主要顏色. 并丟給背景注意 getPalette并不是個異步方法 import styles from ./styles.less; import React, { useState } from react; import Colortheif from colorthief;cons…

RAGFlow:構建高效檢索增強生成流程的技術解析

引言 在當今信息爆炸的時代&#xff0c;如何從海量數據中快速準確地獲取所需信息并生成高質量內容已成為人工智能領域的重要挑戰。檢索增強生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技術應運而生&#xff0c;它將信息檢索與大型語言模型&#xff08;L…