在本次,我們延續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);給出layout的尺寸大小m_hspace = hspacing;
m_vspace = vspacing;
qt::orientations flowlayout::expandingdirections() const這裡我們要求button並會自動補充空白位置,所有給出0。對於layout的尺寸大小,重要的是minimumsize()和sizehint()兩個。如下面。qsize可以通過要求增加某個尺寸大小的文字,它看自動進行調整計算,並需要我們精確計算。最佳大小,我們設定等同於最小尺寸。
qsize flowlayout::minimumsize() const我們補充繼承兩個方法,用於獲取元件之間間隔大小:qsize flowlayout::sizehint() const
int flowlayout::horizontalspacing() const進行布局布局採用setgemetry,這個我們在qt(7)中也介紹過:int flowlayout::verticalspacing() const
int flowlayout::smartspacing(qstyle::pixelmetric pm) const //這是我們定義的private方法,用於從parent中獲得widget之間的間隔
else if(parent->iswidgettype())else
return 0;
}
void flowlayout::setgeometry(const qrect & rect)下面我們根據需求,對dolayout進行說明:
if(!testonly) //設定item的位置對於setgeometry,我們並不需要返回值,但是我們發現,如果元件多,有多行擺放,有時無法全部顯示,這在初始顯示和我們改變window大小的時候可能會出現,而dolayout就返回了layout顯示所有元件時至少需要的height。因此我在width改變是需要重新計算height,需要設定hasheightforwidth()為true,並heightforwidth返回相應的值。item->setgeometry(qrect(qpoint(x,y),item->sizehint()));
x = nextx;
lineheight = qmax(lineheight,item->sizehint().height());
}return y + lineheight - rect.y() + bottom;//返回需要限制所有元件,layout至少要多高
}
bool flowlayout::hasheightforwidth() constint 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...