Qt5佈局管理(一)——QSplitter分割窗口類

概述

本文首先通過三個實例分別介紹Qt5的分割窗口QSplitter類停靠窗口QDockWidget類堆棧窗體QStackedWidget類,然後介紹佈局管理器的使用,最後通過一個綜合實例介紹以上內容的綜合應用。
由於具體的代碼以及如何建立不在我寫本系列筆記的範圍內,所以只對其中重點內容,和我所遇到的一些困惑進行介紹。

分割窗口QSplitter類

Code @ github:https://github.com/LeeHDsniper/LearnQt/tree/master/CH301

實例效果

這裏寫圖片描述

重要代碼

這個程序的所有代碼都集中在main.cpp文件中:

#include "mainwindow.h"
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>
#include <QTextCodec>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFont font("ZYSong18030",12);//指定顯示字體
    a.setFont(font);

    QSplitter *splitterMain;
    QTextEdit *textleft;
    QSplitter *splitterRight;
    QTextEdit *textUp;
    QTextEdit *textBottom;
    splitterMain=new QSplitter(Qt::Horizontal,0);                   //Horizontal:水平的
    textleft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);
    textleft->setAlignment(Qt::AlignCenter);
    //右部分分割窗口
    splitterRight=new QSplitter(Qt::Vertical,splitterMain);        //Vertical:垂直的
    splitterRight->setOpaqueResize(false);                                    //Opaque:不透明的
    textUp =new QTextEdit(QObject::tr("Top Widget"),splitterRight);
    textUp->setAlignment(Qt::AlignCenter);
    textBottom=new QTextEdit(QObject::tr("Bottom Widget"),splitterRight);
    textBottom->setAlignment(Qt::AlignCenter);
    splitterMain->setStretchFactor(0,1);                                      //Stretch Factor:拉伸係數
    splitterMain->setWindowTitle(QObject::tr("Splitter"));
    splitterMain->show();
    //MainWindow w;
    //w.show();
    return a.exec();
}

代碼筆記

1.字體設置代碼

QFont::QFont(const QString & family, int pointSize = -1, int weight = -1, bool italic = false)

這是QFont對象的構造函數之一,第一個參數是字體族,第二個是字體尺寸,第三個是加粗係數,第四個是斜體設置。
2.設置QTextEdit控件的父對象和段落對齊方式

textleft=new QTextEdit(QObject::tr("LeftWidget"),splitterMain);
textleft->setAlignment(Qt::AlignCenter);

對於每個控件的構造函數,都會有一個默認爲0的參數設置其父對象。
而QTextEdit::setAlignment函數設置其段落對齊方式。
3.初始化QSplitter控件的分割方向和其縮放風格

splitterRight=new QSplitter(Qt::Vertical,splitterMain);       splitterRight->setOpaqueResize(true)

QSplitter類的構造函數第一個參數表示該分割窗口是水平分割還是垂直分割,第二個參數是其父對象。
QSplitter的setOpaqueResize設置了分割窗口在縮放時的風格。

opaqueResize : bool
This property holds whether resizing is opaque.
The default resize behavior is style dependent (determined by the SH_Splitter_OpaqueResize style hint). However, you can override it by calling setOpaqueResize()

假設一個QSplitter對象中有兩個窗口,當你調整中間的分割線的位置時,當該QSplitter對象的opaqueResize屬性是false,那麼會出現一個虛線表示調整後的分割線的位置,反之,則什麼也沒有。
4. 設置QSplitter的伸縮因子

splitterMain->setStretchFactor(1,0); 

setStretchFactor( int index, int stretch )用於設定可伸縮控件,它的第一個參數指定要設置控件的序號(按插入順序從0依次編號);第二個參數大於0時表示此控件爲可伸縮控件。
在上面的實例中,splitterMain對象中,共有兩個控件:一個是左邊的textleft控件,另一個是右邊的splitterRight對象。那麼上面的這行代碼就表明,在整個窗口也就是splitterMain在縮放時,splitterRight對象會保持不伸縮狀態:
這裏寫圖片描述
但是當我們去縮放的時候,發現兩個分割窗口都發生了伸縮。我猜測是因爲所有的控件都是默認不伸縮的。這一點可以從下面的例子證明。
修改上面的代碼爲:

splitterMain->setStretchFactor(0,1); 

意味着左邊的textleft控件將是可伸縮的:
這裏寫圖片描述
繼續修改代碼:

splitterMain->setStretchFactor(1,1); 

意味着右邊的splitterRight控件是可伸縮的:
這裏寫圖片描述
繼續修改代碼:

splitterMain->setStretchFactor(2,1); 

這裏寫圖片描述
顯然在splitterMain中是不存在index爲2的控件的,但是窗口在縮放時還是體現出了兩個控件都伸縮的特性。
由此可以證明我的上述猜測是正確的。

下一節:QDockWidget停靠窗口類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章