QT 之QSplitter 切割視窗的兩種方法

2021-10-10 18:13:42 字數 3864 閱讀 4587

//視窗布局

rightsplitter = new qsplitter(qt::vertical);

rightsplitter->addwidget(messagestreewidget);  //在右視窗中新增乙個郵件列表

rightsplitter->addwidget(textedit);                         //顯示文字郵件

rightsplitter->setstretchfactor(1, 1);                      //保證textedit伸展到多餘的空間

mainsplitter = new qsplitter(qt::horizontal);

mainsplitter->addwidget(folderstreewidget);

mainsplitter->addwidget(rightsplitter);

mainsplitter->setstretchfactor(1, 1);                     //使用兩個setstretchfactor保證了把多餘的額外空間都留給textedit

setcentralwidget(mainsplitter);

setwindowtitle(tr("mail client"));

效果如下圖:

//主splitter,以下填充text和子splitter

qsplitter *splittermain=new qsplitter(qt::horizontal,0);

qtextedit *textleft=new qtextedit(qobject::tr("left widget"),splittermain);

textleft->setalignment(qt::aligncenter);

qsplitter *splitterright=new qsplitter(qt::vertical,splittermain);

splitterright->setopaqueresize(true);

//開始填充右邊的splitter,放上兩個text

qtextedit *texttop=new qtextedit(qobject::tr("right top widget"),splitterright);

texttop->setalignment(qt::aligncenter);

qtextedit *textbottom=new qtextedit(qobject::tr("right bottom widget"),splitterright);

textbottom->setalignment(qt::aligncenter);

//設定主splitter

qt"splitters",分界線屬性調整,控制項大小比例調整示例:

//主分割視窗

qsplitter *splittermain = new qsplitter(qt::horizontal, 0);

qtextedit *textleft = new qtextedit(qobject::tr("left widget"), splittermain);

textleft->setalignment(qt::aligncenter);

//右部分割視窗

qsplitter *splitterright = new qsplitter(qt::vertical, splittermain);

splitterright->setopaqueresize(false);

qtextedit *textup = new qtextedit(qobject::tr("top widget"), splitterright);

textup->setalignment(qt::aligncenter);

qtextedit *textbottom = new qtextedit(qobject::tr("bottom widget"), splitterright);

分界線屬性如何調整呢? 我查了一下, 原來是一條分界線是乙個qsplitterhandle 類物件.  通過下面的一些**, 我們可以統一修改分界線的樣式.

mainsplitter->setstylesheet("qsplitter::handle "); //設定分界線的樣式

mainsplitter->sethandlewidth(20);      //設定分界線的寬度

分界線的背景顏色變為"黑色", 並且寬度變得很大, 看來上述**是起到作用了. 如果有很多條分界線, 我們希望只修改第一條的分界線, 怎麼辦呢?  請看下面的一行**:

qsplitterhandle *handle = mainsplitter->handle(1); //注意不是從0 索引開始, 如果找不到分界線, 將返回null.

通過上述**, 我們可以取得left 和 bottom 之間的分界線. 值得注意的是, mainsplitter->handle(0) 是存在的, 但是無法對其進行處理. 為了驗證我們是否真的獲取left 和 bottom 之間的分界線的物件指標, 我們寫上下面的**:

splittermain->setstylesheet("qsplitter::handle "); //設定分界線的樣式

splittermain->sethandlewidth(1);      //設定分界線的寬度 

qsplitterhandle *handle = splittermain->handle(1); //注意不是從0 索引開始, 如果找不到分界線, 將返回null. 

if (handle) 

qsplitterhandle *handle1 = splitterright->handle(1); //注意不是從0 索引開始, 如果找不到分界線, 將返回null. 

if (handle1) 

"); //設定分界線的樣式 

handle1->setfixedwidth(1); 

}

對於left和 top 來說, 他們的本身的大小相對於整個視窗來說, 都是很小的. 這樣就存在著一些多餘的空間, 這些空間可以給left, 也可以給top, 或者兩個平分. 對於left 和 top 各自空間大小的控制, 是通過 qsplitter 的 setstretchfactor 方法, 該方法的宣告:

(所以需要成對設定)

void setstretchfactor(int index, int stretch);

第乙個引數index 是子微件的索引值, 從0 開始. 這裡的話,left是0, top 是1; 第二個引數 stretch 是拉伸係數, int 型別, 下面主要對stretch 的數值進行說明.

1.  splittermain->setstretchfactor(0, 1);

2. splittermain->setstretchfactor(1, 5);

拉伸係數為負整數的微件將佔據最大的多餘空間. 他們內部也應該存在著乙個預設拉伸系數值0. stretch為 0 的微件, 將把最大多餘空間讓給stretch 為正整數的微件. 如果有多個stretch 為正整數的微件, 他們的多餘空間的占有率由通過數字的比例來確定的.

QT 之QSplitter 切割視窗

qt之切分視窗 qsplitter就是乙個可以包含一些其他視窗部件的部件。在切分視窗qsplitter中的這些視窗部件會通過切分條splitter handle而分割開來。使用者可以通過拖動這些分割條改變切分條中子視窗的大小。qsplitter中的子視窗部件將會自動按照建立時的順序乙個挨著乙個的放在...

Qt學習 分割視窗QSplitter類

分割視窗在應用程式中經常用到,比如在類似資源管理器的視窗設計中 下面用 實現上面視窗的設計 1.建立專案時基類選擇qmainwindow,取消gernerate form核取方塊的選中狀態。2.在main.cpp中編寫如下 include include include int main int a...

Qt學習 分割視窗QSplitter類

分割視窗在應用程式中經常用到,比如在類似資源管理器的視窗設計中 下面用 實現上面視窗的設計 1.建立專案時基類選擇qmainwindow,取消gernerate form核取方塊的選中狀態。2.在main.cpp中編寫如下 view plain copy to clipboard print?inc...