1. 程式人生 > >QT的佈局與權重 總結的還不錯

QT的佈局與權重 總結的還不錯

1、QFormLayout:表單佈局,顧名思義就是實現表單模式的佈局。表單就是提示使用者進行互動的一種模式,其主要有兩個列組成,第一個列用於顯示資訊,給予用提提示,一般叫做label域,第二個是需要使用者選擇輸入的,一般叫field域。表單就是很多由這兩項/兩列內容組成的行的佈局。label與field關係就是label是關聯field的。

   表單佈局完全可以使用表格佈局實現,是一種多行兩列的列表,但表單佈局提供一種比較完善的策略,其主要有以下優點

   1)可以適應不同平臺外觀和感覺的一致性

   2)支援一行的label和field域換行顯示,有兩種策略一種是如果輸入域過長,field換行顯示,還有一種就是不管怎麼樣都換行顯示,當然預設是一行顯示兩個域就可以了

   3)創造label--field對很便捷的介面,因為使用一般的佈局,想要關聯label和field,建立好label和feild,並且呼叫label的setBuddy才能完成,但formlayout使用addRow就可以直接對應了。

   表單佈局的樣式可以通過幾個方面體現

   1)label的樣式,是左對齊還是右對齊,可以使用setLabelAlignment進行設定

   2)form的樣式,其內容的顯示方式,則可以通過setFormAlignment進行設定

   3)表單一行內容的顯示,是否換行,則使用setRowWrapPolicy設定,主要值是DontWrap

   Rows,即Field域永遠跟著其label;WrapLongRows,給予label足夠的空間,剩餘的空間給field域,如果field域的最小空間比剩餘的控制元件大/寬,則field會換行到下一行顯示;WrapAllRows,所有的field域不管後面剩餘的空間是否夠,都自動換行。

   4)filed域拉昇生長策略growth policy,其主要是FieldGrowthPolicy控制,首先是FieldStayAtSizeHint 0 ,field域永遠不會超過有效的sizehint尺寸;ExpandingFieldGrow 1,field域水平尺寸拉昇或者最小值超出時會佔用可用空間,其他field在sizehint尺寸下不會擴大grow;AllNonFixedFieldGrow 2所有的field允許他們長grow就長grow到填充可用的空間,如果是fixed固定尺寸策略的field則不會長

   表單由兩列組成,所以一本都是分為label和field域,但是有些控制元件佔用兩行,所以對每個行其可以通過角色來訪問,如LabelRole 0,一個label控制元件,FieldRole 1,一個field空間,SpanningRole就是佔用了label和field兩列的控制元件。當訪問某一個行的某個特定的空間時,如果不知道具體名,則可以通過此角色訪問。

   1.1 表單佈局formLayout的屬性

   1)fieldGrowthPolicy :FieldGrowthPolicy ,表示feild域如何擴張延伸的方式

   如果沒有任何一個field域可以延伸並且表單form重置了大小,多餘的空間會根據當前的表單form aligment對齊方式分部。

   fieldGrowthPolicy()獲取此屬性。setFieldGrowthPolicy(FieldGrowthPolicy)進行設定

   2)formAligment : Qt::Alignment ,此屬性表示扁擔佈局formlayout內容的對齊方式。使用formAlignment()獲取,setFormAlignment(Qt::Alignment)進行設定

   3)horizontalSpacing :int表示每行空間之間的空間間隔。通過horizontalSpacing()獲取,setHorizontalSpacing(int)設定

   4)域horizontalSpacing對應的是verticalSpacing儲存了垂直放置的控制元件之間的間隔。verticalSpacing獲取,setVerticalSpacing設定。

   5)labelAlignment:Qt::Alignment 儲存標籤label水平方向的對齊alignment模式。

   通過labelAlignment()獲取,setLabelAlignment進行設定。

   6)rowWrapPolicy : RowWrapPolicy儲存錶行每行換行的方式。其可見值概述已做詳細描述

   1.2 QFormLayout的介面

   表單佈局是以行作為基本單位的,所以需要為表單佈局新增控制元件,一個是標籤域label,一個是輸入域field,通過addRow方法進行新增。

   1)新增一行表單

   新增第一個域可以是QWidget或者QString,如果是後者會自動建立一個QLabel,並且將field的QWidget設定為label的buddy。field可以是QLayout或者QWidget。

   如果是佔用兩行的空間,則只有一個變數,可以是QWidget或者QLayout。具體形式如下

   void addRow(QWidget *label,QWidget *field):新增一行到佈局末尾,使用label和field填充表單佈局的對應域。

   void addRow(QWidget *label,QLayout *layout):

   void addRow(const QString *labelText,QWidget *widget):會把widget設定為qlabel的buddy

   void addRow(const QString *labelText,QLayout *layout):

   void addRow(QWidget *widget):佔用兩列

   void addRow(QLayout *layout):佔用兩列

   int count(),返回有多少個元素,在後續查詢、插入和刪除的時候用。

   2)查詢元素

   void getItemPosition(int index,int *rowPtr,ItemRole *rolePtr):找到指定位置index元素item的行數row值和角色值。如果index越界了,rowptr值被設定為-1,讓否則將值存到rowPtr和rolePtr中。

   void getLayoutPosition(QLayout *layout,int *rowPtr,ItemRole *rolePtr)

   找到特定的子佈局layout的行號row和role(colume)。如果layout不在formLayout,那麼rowPtr設定為-1,否則正確設定。

   void getWidgetPosition(QWidget *w,int *rowPtr,ItemRole *rolePtr)追溯控制元件w在佈局中的行號row和角色role。如果此佈局沒有w,則rowPtr返回 -1.

   QLayoutItem *itemAt(int index)返回索引為index的控制元件

   QLayoutItem *itemAt(int row,ItemRole role)返回佈局中元素在row行角色是role的控制元件,如果沒有則返回0

   QLayoutItem * QFormLayout::takeAt ( int index )獲取索引為index的元素並刪除原來的元素

   3)插入元素,與addRow對應,只是新增一個引數及int row,指定在某個行之後新增。如果row越界,則自動新增到最後一行。

   setItem(int row,ItemRole role,QLayoutItem *item)將item元素設定到指定的行號row的指定角色role的位置。如果此處的位置已經被佔用了,則插入失敗。

   void setLayout(int row,ItemRole role,QLayout *layout)將指定的layout設定到行row角色為role的位置,根據需要擴充套件沒有行元素的佈局。如果此單元被佔用,則不會插入

   void setWidget(int row,ItemRole,QWidget *widget)將指定的widget設定到行row角色為role的位置,根據需要擴充套件沒有行元素的佈局。如果此單元被佔用,則不會插入

   4)QWidget *labelForField(QWidget *field)返回與field關聯的label控制元件

      QWidget *labelForLayout(QLayout *layout)返回與field關聯的label控制元件

   5)QSize minimumSize()獲取佈局的最小尺寸,對應的有maxmumSize最大尺寸

   6)rowCount()返回此佈局中有多少行

   7)setGeometry(QRect rect)設定佈局的空間大小

   8)void setSpacing(int spacing)設定垂直和水平方向的空間間隔。spacing()返回這個值,前提是horizontal和vertical空間相等

   具體使用見一個簡單的輸入例子:使用者登入資訊視窗

#include

#include
#include
#include
voidinitLayout(QWidget&w)
{
QFormLayout*mainFormLayout=newQFormLayout();
mainFormLayout->setSizeConstraint(QLayout::SetFixedSize);
mainFormLayout->setVerticalSpacing(40);
mainFormLayout->setHorizontalSpacing(10);
mainFormLayout->setRowWrapPolicy(QFormLayout::DontWrapRows);
mainFormLayout->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
mainFormLayout->setLabelAlignment(Qt::AlignRight|Qt::AlignVCenter);
mainFormLayout->setFormAlignment(Qt::AlignCenter);
QLineEdit*nameLineEdit=newQLineEdit("enteryourname");
//nameLineEdit->setInputMask("ANNNNNnnnnnnnnnnnnnn");
nameLineEdit->setDragEnabled(true);
nameLineEdit->setAlignment(Qt::AlignCenter);
nameLineEdit->setFrame(false);
nameLineEdit->show();
QLineEdit*pwdLineEdit=newQLineEdit();
pwdLineEdit->setEchoMode(QLineEdit::Password);
pwdLineEdit->setInputMask("XXXXXX");//6-20
pwdLineEdit->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
pwdLineEdit->setDragEnabled(false);
pwdLineEdit->setFrame(true);
pwdLineEdit->show();
QPushButton*buttonOk=newQPushButton("OK");
QObject::connect(buttonOk,SIGNAL(pressed()),nameLineEdit,SLOT(clear()));
QPushButton*buttonCancel=newQPushButton("Cancel");
QObject::connect(buttonCancel,SIGNAL(pressed()),nameLineEdit,SLOT(clear()));
QHBoxLayout*buttonLayout=newQHBoxLayout();
buttonLayout->setSizeConstraint(QLayout::SetFixedSize);
buttonLayout->addWidget(buttonOk);
buttonLayout->addWidget(buttonCancel);
mainFormLayout->addRow("&Name:",nameLineEdit);
mainFormLayout->addRow("&Password:",pwdLineEdit);
mainFormLayout->addRow(buttonLayout);
//mainFormLayout->addRow(buttonOk);
//mainFormLayout->addRow(buttonCancel);
w.setLayout(mainFormLayout);
}
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
FormLayouTestw;
w.resize(1280,720);
initLayout(w);
w.show();
returna.exec();

}

執行結果如下

【轉】QT佈局與權重

   2、 QBoxLayout:框佈局,這是最簡單的一種佈局,這種佈局將需要管理的控制元件排成一列或者一行。其實講QBoxLayout佔用的空間分成一行或者一列框,然後把佈局所管理的控制元件填進取。

   此佈局的方向orientation有兩種,水平的即horizontal和垂直的vertical。每一個被放置到框裡面的佈局獲取的大小最小是其minimum大小,最大不超過maxmumSize。任何多餘的空間將根據伸展因子共享處理。如果此佈局不是最頂層佈局,則一定需要將佈局放置到父視窗或者佈局裡面

   為了更快捷的使用,可以使用QHBoxLayout和QVBoxLayout建立指定方向的boxlayout,當然可以根據排列空間的方式不同,使用QBoxLayout建立佈局,其方向主要是水平方向:LeftToRight、RightToLeft;垂直方向:BottonToTop,TopToBottom.

   新增一個box控制元件主要方式如下:

   1)addWidget()新增一個視窗不見widget到QBoxLayout,並且設定此不見得伸縮因子。伸展因子是boxes的行使用。

   2)addSpacing()新增一個空的box。

   3)addStretch()建立一個可伸縮的box

   4)addLayout()將一個包含其他控制元件的佈局新增到box上並設定layout的伸縮因子。同樣有對應的insert方法。

   QBoxLayout有兩個邊界寬度,一個是內容邊界,setContentsMargins,設定每個視窗部件的外部邊距。這是每個QBoxLayout四邊的保留空間

   setSpacing設定兩個相鄰的box之間的間距,可以使用addSpacing獲取更多的空間。

   刪除一個控制元件,使用removeWidget,或者呼叫QWidget::hide()一樣可以從佈局中刪除,知道show被呼叫。

   簡單的講,這個佈局是要注意以下幾點:

   第一,佈局控制元件的排列方式決定了佈局的方向,其主要有兩個佈局,水平和垂直

   第二,佈局各個空間的拉昇,不是所有的控制元件平分佈局的空間,而是根據伸縮因子和顯示比例完成控制元件空間的分配。

   第三,各個控制元件之間的間隔及整個控制元件和佈局的外部邊距大小。這三點決定了此佈局的使用

   2.1 常用的函式

   QBoxLayout::QBoxLayout ( Directiondir, QWidget * parent = 0 )

   建立一個框佈局,dir有TopToBottom,BottomToLeft,LeftToRight及RightToLeft

   void QBoxLayout::addLayout ( QLayout * layout, int stretch = 0 )

   新增一個佈局到框的末尾,設定伸縮因子stretch factor為stretch值,預設為0

   void QBoxLayout::addSpacing ( int size )

   新增一個不能伸縮的空間(一個QSpacerItem),其寬度設定為size到佈局末尾。框佈局提供了預設的邊距margin和spacing,這是額外新增的空間。

   void addStretch(int stretch = 0)

   新增一個可伸縮的空間(一個QSpacerItem),設0為最小值並且伸縮因子為stretch值到佈局末尾

   void addStrut(int size)

   限制垂直尺寸到最小值size,如一個LeftToRight的框佈局的高度。

   void addWidget(QWidget *w,int stretch=0,Qt::Alignment alignment=0)

   新增一個視窗部件到此框佈局的末尾,並設定其伸縮率為stretch和alignment。

   stretch設定為0,並且沒有其他空間有stretch大於0的控制元件,則空間的分配按照預設的值進行分配。alignment被賦值為alignment,預設值為0,表示控制元件將填充整個單元。

   注意此分配因子的工作原理,stretch其實相當於一個佔位符號,其可伸縮在0與stretch值之間,原則就是如果分配完空間有額外的空間,則根據stretch值大小比例去分,如果佈局空間不夠,則會壓縮這個空間以被其他控制元件使用。

   比如有兩個控制元件,在新增的時候第一個控制元件設定為200,第二個設定為0,那麼最後結果是第一個控制元件比第二個控制元件多佔用0-200的空間,如果第二個也設定為200,則兩個伸縮係數一樣的,所以兩個控制元件佔用空間基本一致,如果第二個設定為100,則其空間佔有約以2:1的比例分多餘的空間。

   本質上來講spacing和stretch都是QSpaceItem控制元件,佔用空間用的,只是一個固定的,一個可伸縮的。

   int count()返回此佈局有多少個空間,此值在後續中inset相關的函式中進行使用。

   Direction direction()返回佈局的方向,新增控制元件與伸縮與這個方向一致。

   void insertLayout ( int index, QLayout * layout, int stretch = 0 )

   插入佈局到指定index位置,並設定伸縮因子stretch。如果index是負數,layout新增到末尾。

   void QBoxLayout::insertSpacing ( int index, int size )

   在指定位置插入大小為size空間的不可伸縮的box。次函式常用於在指定位置新增空間。

   void QBoxLayout::insertStretch ( int index, int stretch = 0 )

   在指定位置新增可伸縮的空間,從0到伸縮因子stretch伸縮。

   void QBoxLayout::insertWidget ( int index, QWidget * widget, int stretch = 0,Qt::Alignmentalignment = 0 )

   在指定位置index插入控制元件widget

   QSize minimumSize() QSize maxmumSize()獲取佈局的最大最小空間尺寸

   setDirection()設定方向

   setGeometry(QRect r)設定佈局空間大小尺寸

   setSpacing(int spacing)設定相鄰控制元件的間距。

   setStretch(int index,int stretch)

   設定指定位置的伸縮因子為stretch值

   bool setStretchFactor(QWidget *w,int stretch)設定視窗部件QWidget的伸縮因子為stretch,如果找到此部件返回true,否則返回false

   bool setStretchFactor(QLayout *layout,int stretch)設定子佈局的伸縮因子為stretch,如果找到此佈局返回true,否則返回false

   QSize sizeHint()返回合適的佈局尺寸

   int spacing()如果空間屬性可用,則直接返回,否則需要通過計算後返回。因為佈局間距受視窗控制元件樣式決定。

   int QBoxLayout::stretch ( int index )

   返回index位置的伸縮因子stretch

   注:stretch其實是規定了一個可以伸縮的範圍,在這個範圍內更好的合理的展現佈局,如果空間過大,則此stretch會佔用的多一點,如果空間太少,則會佔用的少一點,addSpacing是新增一個固定大小空間的box,此相當於一個控制元件佔用一個空間,只是不顯示,其佈局在處理的時候不可壓縮這部分空間,舉例如下:

QPushButton*buttonOk=newQPushButton("OK");

QPushButton*buttonCancel=newQPushButton("Cancel");
QBoxLayout*buttonLayout=newQBoxLayout(QBoxLayout::LeftToRight);
buttonLayout->setSizeConstraint(QLayout::SetFixedSize);
buttonLayout->addStretch(10);
buttonLayout->addWidget(buttonOk);

buttonLayout->addStretch(200);

//buttonLayout->addSpacing(200);
buttonLayout->addWidget(buttonCancel);

buttonLayout->addStretch(10);

   效果如下:

【轉】QT佈局與權重【轉】QT佈局與權重

buttonLayout->addStretch(200);       buttonLayout->addSpacing(200);

說明:QSpacerItem是為佈局提供空白空間的類,在addStretch及addSpacing實際上就是處理這些。

   3、QStackedLayout:堆疊佈局,是將一堆widget控制元件放置在一起,只有一個控制元件是能看見的。其不是管理控制元件的尺寸即位置,而是尺寸的顯示,可以被一些字視窗控制元件(頁)在同一空間填充。多用於頁面切換等的操作。但是QStackedWidget並沒有提供一種方法給使用者區切換頁。這種方式就需要藉助QComboBox或者QListWidget去儲存每個頁面的標題,從而配合實現切換頁面。

   當填充佈局的時候,視窗部件widget會載入到內部的一個列表中,通過indexOf()方法返回一個視窗部件widge的索引在內部的列表中。當然widget可以被新增到列表的末尾,或者插入到指定的索引位置。removeWidget()方法刪除在索引序號為index的視窗部件。通過count()方法可以獲取到載入到佈局layout的元素個數。

   widget()方法返回在指定位置上的部件widget,當前螢幕上顯示的的視窗部件的索引序號值可以用使用currentIndex()獲取,並且使用setCurrentIndex()設定。相似的情況,當前的顯示可見的視窗部件可以通過currentWidget獲取到,使用setCurrentWidget()更新。

   但是不管什麼情況,只要當前widget的佈局變了或者remove刪除,則currentChanged()訊號和widgetRemoved()訊號會一次傳送。

   3.1 重要的屬性

   1)count:const int表示佈局layout包含的視窗控制元件的數量,count()訪問。

   2)currentIndex:int,此屬性儲存當前可見視窗部件的index值,如果沒有當前視窗部件則返回-1,使用currentIndex()訪問,setCurrentIndex(int index)進行設定。如果currentIndex改變了,則訊號currentChanged(int index)訊號發射。

相關推薦

QT佈局權重 總結不錯

1、QFormLayout:表單佈局,顧名思義就是實現表單模式的佈局。表單就是提示使用者進行互動的一種模式,其主要有兩個列組成,第一個列用於顯示資訊,給予用提提示,一般叫做label域,第二個是需要使用者選擇輸入的,一般叫field域。表單就是很多由這兩項/兩列內容組成的

《第一行程式碼Android》學習總結第三章 自定義佈局控制元件

1、View是Android中最基本的元件,它可以在螢幕上繪製一塊矩形區域,並在這塊區域內響應各種事件。所有控制元件都直接或間接繼承自View。 2、ViewGroup是一種特殊的View,可以包含很多子View和子ViewGroup,是一個用於放置控制元件和佈局的容器。所有佈局都直接或間

Qtablewidget用法總結不錯

2018年11月01日 09:42:34 一隻笨鳥 閱讀數:5 個人分類: Qt

Qt訊號槽使用方法最完整總結

    在圖形介面程式設計中(參考《C++最好的圖形庫是什麼?》),元件之間如何實現通訊是核心的技術內容。Qt 使用了訊號與槽的機制,非常的高效、簡單、易學,方便開發者的使用。本文詳細的介紹了Qt 當中訊號與槽的概念,並演示了各種訊號與槽的連線方式。   一、什麼是訊號和槽(S

JQuery特效動畫總結

jpg 自動 oid scrip fun 三種 塊元素 參數調用 總結 幾種特效 一、顯示與隱藏show、hide js寫法: docment.getElementById("p1").style.display="block"; document.getElementBy

機器學習 第二章:模型評估選擇-總結

但是 交叉 roc曲線 掃描 com ram hidden 技術分享 preview 1、數據集包含1000個樣本,其中500個正例,500個反例,將其劃分為包含70%樣本的訓練集和30%樣本的測試集用於留出法評估,試估算共有多少種劃分方式。 留出法將數據集劃分為兩個互斥的

分針網——每日分享:HTTP協議理解應用總結

http 應用總結 領取免費IT資料 加群:272292492 更多文章:www.f-z.cn Request & Response Re

最近遇到的異常錯誤總結

reference dstat 異常 總結 ria num 空指針 格式化 first 異常 NumberFormatException 數字格式化異常 ArithmeticException 算術異常 ArrayIndexOutOfBoundsException 數組

加快QT工程編譯速度(可給Qt for Android設置)

qmake targe 沒有 利用 tools too blank tab 這樣的 一、多核編譯 環境:win10, Qt 5.4.1,編譯器mingw32 項目: Qt for Android Qt Creator 在編譯android項目時不支持預編譯,默認cpu

cmake使用示例整理總結

正則表達式 match related sha dash href 縮進 some 系統信息 本文代碼托管於github cmake_demo cmake中一些預定義變量 PROJECT_SOURCE_DIR 工程的根目錄 PROJECT_BINARY_DIR

協程在Web服務器中的應用(配的圖不錯

via 進程 應用 lib 協程 解決方案 多個 微線程 變量 協程(纖程,微線程)這個概念早就有之,各家互聯網公司也都有研究,但在國內各大論壇和大會熱起來,還是今年的事。 最近參與討論開放平臺建設和架構設計過程中,有同事提到了使用協程代替線程,能

SQL SERVER 2008數據庫管理維護總結

sql server1、事物日誌 分為小的虛擬日誌VLF,它有編號叫LSN2、檢查點默認每隔1分鐘將內存數據存盤,故障點發生後日誌重做,事物根據提交與否前滾或回滾。3、在數據庫整體主菜單欄選擇屬性可設置數據文件和日誌文件的存放地點,設置完後需要重啟服務,可主菜單右鍵重啟服務或通過windows系統服務重啟。4

asp.net 表單數據提交,常見方式錯誤總結

state 屬性 服務器 ews 一個 2.0 就會 數據頁面 url 在ASP中,我們通常把表單提交到另外一個頁面(接受數據頁面)。但是在ASP.NET中,服務端表單通常都是提交到本頁面的,如果我設置 form1.action="test.aspx"; 那麽就會導致視圖驗

SpringMVCStruts2區別比較總結

req 攔截器 返回 方式 log 編碼 strong 原則 麻煩 1、Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上Spring

技術轉型考研總結

經驗 百度雲 百度雲盤 考研 轉型 公眾號 。。 畢業 公眾 深夜,思考著幾件事,畢業到現在也做了不少事情,折騰了好多,從最開始的java學習到hadoop學習然後到雲計算AI的學習,然後期間又準備考研,一切感覺時間是那麽不夠用。所以針對想在職考研(僅針對計算機其他專業可以

項目驗收團隊總結

沒有 成員 unit 過去 影響 完成 eid 探索 就是 Loding~ 1. 作品下載及訪問地址 平臺1 平臺2 平臺3 2. GitHub鏈接地址 GitHub鏈接 3. 完成的主線和功能 1> 完成了一學期學習模塊的模擬 2>

CW程序編碼測試總結

while tar source 測試設計 數組 stat 單詞 efault UC github地址:https://github.com/star-mick/wcproject PSP 階段: 估計耗時(min) 實際耗時(min) 計劃:

MVC的發展應用總結

XML ble r.java 重復 操作符 設計與實現 winform 定制 思考 1、 最初的程序都是是命令行界面,後來進化到GUI(Graphic User Interface),即圖形化用戶接口。以一個計算器軟件為例,一個程序無論C/S還是B/S結構都需要搞定:   

Python之旅.第四章.模塊包.總結(未完待遇)

standard 後綴 att 擔心 lse 綁定 做的 業務 搜索 一、模塊 模塊: 一系列功能的集合體,在python中一個py文件就是一個模塊,模塊名就是py文件的文件名; 模塊的好處: 1.減少重復的代碼 2.拿來主義 定義模塊: 就是創建一個py文件;

26.QT顏色布局

下拉 contents vbox nal style qpi size dialog endif dialog.h 1 #ifndef PALETTE_H 2 #define PALETTE_H 3 4 #include <QDialog>