概述
本文首先通過三個實例分別介紹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的控件的,但是窗口在縮放時還是體現出了兩個控件都伸縮的特性。
由此可以證明我的上述猜測是正確的。