1. 程式人生 > 實用技巧 >Qt佈局管理

Qt佈局管理

分割視窗類 QSplitter

使用流程如下:

建一個QSplitter類物件,作為主分割視窗,設定此分割視窗為水平分割視窗。

QSplitter *splitterMain =new QSplitter(Qt::Horizontal,0);

新建一個QTextEdit類物件,並將其插入主分割視窗中。

QTextEdit *textLeft =new QTextEdit(QObject::tr("Left Widget"),splitterMain);

設定TextEdit中文字的對齊方式

textLeft->setAlignment(Qt::AlignCenter);

新建一個QSplitter類物件,作為右分割視窗,設定此分割視窗為垂直分割視窗,並以主分割視窗為父視窗。

QSplitter *splitterRight =new QSplitter(Qt::Vertical,splitterMain);

呼叫setOpaqueResize(bool)方法用於設定分割視窗的分割條在拖曳時是否為實時更新顯示,若設為true則實時更新顯示,若設為false則在拖曳時只顯示一條灰色的粗線條,在拖曳到位並釋放滑鼠後再顯示分割條。

splitterRight->setOpaqueResize(false);

呼叫setStretchFactor()方法用於設定可伸縮控制元件,它的第1個引數用於指定設定的控制元件序號,控制元件序號按插入的先後次序從0起依次編號;第2個引數為大於0的值,表示此控制元件為可伸縮控制元件。

splitterMain->setStretchFactor(1,1);


停靠視窗類 QDockWidget

使用流程如下:

建立一個QDockWidget物件的停靠窗體。

QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);

設定此停靠窗體的屬性,通常呼叫setFeatures()及setAllowedAreas()兩種方法。

void setFeatures(DockWidgetFeatures features);
/*引數QDockWidget::DockWidgetFeatures指定停靠窗體的特性,包括以下幾種引數。
① QDockWidget::DockWidgetClosable:停靠窗體可關閉。
② QDockWidget::DockWidgetMovable:停靠窗體可移動。
③ QDockWidget::DockWidgetFloatable:停靠窗體可浮動。
④ QDockWidget::AllDockWidgetFeatures:此引數表示擁有停靠窗體的所有特性。
⑤ QDockWidget::NoDockWidgetFeatures:不可移動、不可關閉、不可浮動。*/

void setAllowedAreas(Qt::DockWidgetAreas  areas);
/*引數Qt::DockWidgetAreas指定了停靠窗體可停靠的區域,包括以下幾種引數。
① Qt::LeftDockWidgetArea:可在主視窗的左側停靠。
② Qt::RightDockWidgetArea:可在主視窗的右側停靠。
③ Qt::TopDockWidgetArea:可在主視窗的頂端停靠。
④ Qt::BottomDockWidgetArea:可在主視窗的底部停靠。
⑤ Qt::AllDockWidgetArea:可在主視窗任意(以上四個)部位停靠。
⑥ Qt::NoDockWidgetArea:只可停靠在插入處。
*/

新建一個要插入停靠窗體的控制元件,常用的有QListWidget和QTextEdit。

QTextEdit *te1 =new QTextEdit();
te1->setText(tr("Window1,The dock widget can be moved between docks by the user" ""));

將控制元件插入停靠窗體,呼叫QDockWidget的setWidget()方法。

dock->setWidget(te1);

使用addDockWidget()方法在MainWindow中加入此停靠窗體。

addDockWidget(Qt::RightDockWidgetArea,dock);


堆疊窗體類 QStackedWidget

使用流程如下:

設定佈局

    QHBoxLayout *mainLayout =new QHBoxLayout(this);
    mainLayout->setMargin(5);
    mainLayout->setSpacing(5);

建立列表控制元件

    list =new QListWidget(this);
    list->insertItem(0,tr("Window1"));
    list->insertItem(1,tr("Window2"));
    list->insertItem(2,tr("Window3"));

建立堆疊窗體並逐個加入標籤控制元件

    label1 =new QLabel(tr("WindowTest1"));
    label2 =new QLabel(tr("WindowTest2"));
    label3 =new QLabel(tr("WindowTest3"));

    stack =new QStackedWidget(this);
    stack->addWidget(label1);
    stack->addWidget(label2);
    stack->addWidget(label3);

將列表和堆疊窗體加入佈局

mainLayout->addWidget(list);
mainLayout->addWidget(stack,0,Qt::AlignHCenter);

設定可伸縮控制元件,第1個引數用於指定設定的控制元件(序號從0起編號),第2個引數的值大於0則表示此控制元件為可伸縮控制元件。

mainLayout->setStretchFactor(list,1):
mainLayout->setStretchFactor(stack,3);

QListWidget的currentRowChanged()訊號與堆疊窗體的setCurrentIndex()槽函式連線起來,實現按選擇顯示窗體。此處的堆疊窗體index按插入的順序從0起依次排序,與QListWidget的條目排序相一致。

connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int))):


基本佈局

addWidget()方法用於加入需要佈局的控制元件,方法原型如下:

void addWidget
(
	QWidget *widget,           			//需要插入的控制元件物件
	int  fromRow,              			//插入的行
	int  fromColumn,           			//插入的列
	int  rowSpan,              			//表示佔用的行數
	int  columnSpan,           			//表示佔用的列數
	Qt::Alignment  alignment=0  		//描述各個控制元件的對齊方式
)

addLayout()方法用於加入子佈局,方法原型如下:

void addLayout
(
	QLayout *layout,              		//表示需要插入的子佈局物件
	int row,                      		//插入的起始行
	int column,                  		//插入的起始列
	int rowSpan,                  		//表示佔用的行數
	int columnSpan,               		//表示佔用的列數
	Qt::Alignment alignment=0      	//指定對齊方式
)

使用流程如下:

  • 建立控制元件並進行設定;
    • 文字
    • 風格:setFrameStyle
    • 選項:addItem
  • 建立子佈局(QHBoxLayout、QVBoxLayout)並進行設定;
    • 列寬:setColumnStretch
    • 列距:setSpacing
    • 行距:setMargin
  • 將控制元件加入子佈局;
    • 加入:addWidget
    • 佔位:addStretch
  • 建立主佈局(QGridLayout)並進行設定;
  • 將子佈局加入主佈局;
    • 加入:addLayout