FlowLayout 自定義布局

2021-07-10 15:42:41 字數 3133 閱讀 1606

在本次,我們延續qt(7)的學習,再次對layout的繼承進行學習。參考在此之前,我們對qt編譯中碰到的一些問題進行記錄:

問題1:編譯中出現make : g++沒有找到

對於ubuntu可以使用apt-get install g++,但是在採用yum的系統,例如meego,沒有g++的包,yum那裡採用了另外的名字yum install gcc-c++。

問題2:編譯中出現undefined reference to `vtable for ***x(某個類名)'

出去這種情況,需要檢查*.pro檔案,看看是否將所需的*.h和*.cpp加入,或者加入一些空檔案。

記錄1:制定moc生成檔案存放的目錄

moc命令將含q_object的標頭檔案轉換成標準.h檔案,在我們定義q_object後,很可能會生成moc_***xx.cpp的檔案。方式:moc_dir = build。

言歸正捲,我們這次建立乙個自定的layout,上面的widget,根據我們addwidget的先後順序,從左向右排序,如果超過範圍,就從下一排開始,也是從左向右,很像現代文字的書寫方式。如圖所示:

搭建程式框架

qtmain.cpp為主程式,mywindow.h和mywindow.cpp為視窗類,flowlayout.h和flowlayout.cpp是我們用於構造我們布局qlayout的子類。mywindow.cpp如下:

mywindow :: mywindow()

構造自定義的布局qlayout子類:存放qlayoutitem我們在qt(7)中學習過,這裡我們使用乙個qlistitemlist來存放我們的item,並且進行了additem,count,itemat(int index),takeat(int index)這幾個virtual方法,同時在釋放方法~flowlayout()中清空itemlist,並釋放空間。這裡,將並在詳細說明。可以參見參考中給出的源**。

完成構建函式

在mywindow類中,我們並不需要有特別的建構函式。在layout中,計算margin,也就是各widget之間的空隙是乙個很麻煩的事情。在例子中,我們提供可定製margin(預設值為11,由於預設的邊框為1,所以11大抵重視覺角度看就是10px),這是layout之間的留邊位置,同時我們也設定了元件之間的間隔大小(m_hspace,m_vspace),如下:

flowlayout :: flowlayout(qwidget * parent,

int margin,int hspacing,int vspacing)

:qlayout(parent),m_hspace(hspacing),m_vspace(vspacing)

這裡我們看到乙個有趣的寫法,實際上其等同與在方法中執行了:

qlayout(parent);

m_hspace = hspacing;

m_vspace = vspacing;

給出layout的尺寸大小

qt::orientations flowlayout::expandingdirections() const

這裡我們要求button並會自動補充空白位置,所有給出0。對於layout的尺寸大小,重要的是minimumsize()和sizehint()兩個。如下面。qsize可以通過要求增加某個尺寸大小的文字,它看自動進行調整計算,並需要我們精確計算。最佳大小,我們設定等同於最小尺寸。

qsize flowlayout::minimumsize() const

qsize flowlayout::sizehint() const

我們補充繼承兩個方法,用於獲取元件之間間隔大小:

int flowlayout::horizontalspacing() const

int flowlayout::verticalspacing() const

int flowlayout::smartspacing(qstyle::pixelmetric pm) const  //這是我們定義的private方法,用於從parent中獲得widget之間的間隔

else if(parent->iswidgettype())else

return 0;

}

進行布局布局採用setgemetry,這個我們在qt(7)中也介紹過:

void flowlayout::setgeometry(const qrect & rect)

下面我們根據需求,對dolayout進行說明:

if(!testonly) //設定item的位置

item->setgeometry(qrect(qpoint(x,y),item->sizehint()));

x = nextx;

lineheight = qmax(lineheight,item->sizehint().height());

}return y + lineheight - rect.y() + bottom;//返回需要限制所有元件,layout至少要多高

}

對於setgeometry,我們並不需要返回值,但是我們發現,如果元件多,有多行擺放,有時無法全部顯示,這在初始顯示和我們改變window大小的時候可能會出現,而dolayout就返回了layout顯示所有元件時至少需要的height。因此我在width改變是需要重新計算height,需要設定hasheightforwidth()為true,並heightforwidth返回相應的值。

bool flowlayout::hasheightforwidth() const

int flowlayout::heightforwidth(int width) const

自定義布局

自定義view布局 1.確定每個view的位置和尺寸 2.作用 為繪製和觸控範圍做支援 1.對於繪製 知道自己需要在 繪製。2.對於觸控反饋 知道使用者的點是在 自定義view布局的工作內容 自定義view的工作分為兩個階段 測量階段和布局階段 測量流程 從上到下遞迴呼叫每個view或者viewgr...

自定義布局控制項

本文介紹一種自定義控制項的方法,由控制項布局和控制項 2部分組成。效果為乙個自定義標題欄,由乙個按鈕 乙個文字 乙個按鈕組成,並定義了各子件的事件。一 title布局如下 二 如下。重寫構造器,在其中展開布局,找到子控制項繫結事件 public class titlelayout extends l...

自定義Toast實現自定義Toast布局

平時我們使用toast的時候都是這樣的一種方法 toast toast toast.maketext context,duration 現在我們來自定義下toast的布局,首先看下toast建立時的源 public static toast maketext context context,char...