前言
一、分割窗口QSplitter类
创建一个简单的分割窗口,整个窗口由三个子窗口构成,各个子窗口之间的大小可随意拖拽改变;
代码如下(示例):
#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 = new QSplitter(Qt::Horizontal); //(a)
QTextEdit *textLeft = new QTextEdit(QObject::tr("Left Widget"), splitterMain); //(b)
textLeft->setAlignment(Qt::AlignCenter); //(c)
//右分割窗口
QSplitter *splitterRight = new QSplitter(Qt::Vertical, splitterMain); //(d)
splitterRight->setOpaqueResize(false); //(e)
QTextEdit *textUp = new QTextEdit(QObject::tr("Top Widget"), splitterRight);
textUp->setAlignment(Qt::AlignCenter);
QTextEdit *textBottom = new QTextEdit(QObject::tr("Bottom Widget"), splitterRight);
textBottom->setAlignment(Qt::AlignCenter);
splitterMain->setStretchFactor(1, 1); //(f)
splitterMain->setWindowTitle(QObject::tr("Splitter"));
splitterMain->show();
// MainWindow w;
// w.show();
return a.exec();
}
(a)新建一个QSplitter类对象,作为主分割窗口,设定此分割窗口为水平分割。
(b)新建一个QTextEdit类对象,并将其插入主分割窗口中。
(c)设定TextEdit中文字对齐方式,常用对齐方式有:
- Qt::AlignLeft:左对齐
- Qt::AlignRight:右对齐
- Qt::AlignCenter:文字居中(Qt::AlignHCenter为水平居中,Qt::AlignVCenter为垂直居中)。
- Qt::AlignUp:文字与顶部对齐
- Qt::AlignBottom:文字与底部对齐
(d)新建一个QSplitter类对象,作为右分割窗口,设定此分割窗口为垂直分割窗口,并以主分割窗口为父窗口。
(e)调用setOpaqueResize(bool)方法用于设定分割窗口的分割条在拖拽时是否为实时更新显示,若设为true则实时更新显示,若设为false则在拖拽时只显示一条灰色的粗浅线,在拖拽到位并释放鼠标后再显示分割条。默认为true。
(f)调用setStretchFactor()方法用于设定可伸缩控件,第一个参数用于指定设置的控件序号,控件序号按插入的先后次序从0起依次编号;第二个参数为大于0的值,表示此控件为可伸缩控件。
二、停靠窗口QDockWidget类
设置停靠窗口的一般流程如下:
(1)创建一个QDockWidget对象的停靠窗体;
(2)设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两种方法;
(3)新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit;
(4)将控件插入停靠窗体,调用QDockWidget的setWidget()方法;
(5)使用addDockWidget()方法在MainWindow中加入此停靠窗体。
代码如下(示例):
#include "dockwindows.h"
#include <QTextEdit>
#include <QDockWidget>
DockWindows::DockWindows(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("DockWindows")); //设置主窗口的标题栏文字
QTextEdit *te = new QTextEdit(this); //定义一个QTextEdit对象作为主窗口
te->setText(tr("Main Window"));
te->setAlignment(Qt::AlignCenter);
setCentralWidget(te); //将此编辑框设为主窗口的中央窗口
//停靠窗口1
QDockWidget *dock = new QDockWidget(QObject::tr("DockWindow1"), this);
//可移动
dock->setFeatures(QDockWidget::DockWidgetMovable); //(a)
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); //(b)
QTextEdit *te1 = new QTextEdit();
te1->setText(tr("Window1,The dock widget can be moved between docks by the user" ""));
dock->setWidget(te1);
addDockWidget(Qt::RightDockWidgetArea, dock);
//停靠窗口2
dock = new QDockWidget(tr("DockWindow2"), this);
dock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);//可关闭、可浮动
QTextEdit *te2 = new QTextEdit();
te2->setText(tr("Window2,The dock widget can be detached from the main window,""and floated as an independent window, and can be closed"));
dock->setWidget(te2);
addDockWidget(Qt::RightDockWidgetArea, dock);
//停靠窗口3
dock = new QDockWidget(tr("DockWindow3"), this);
dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //全部特性
QTextEdit *te3 = new QTextEdit();
te3->setText(tr("Window3,The dock widget can be closed, moved, andfloated"));
dock->setWidget(te3);
addDockWidget(Qt::RightDockWidgetArea, dock);
}
(a)setFeatures()方法设置停靠窗体的特性,原型如下:
void setFeatures(DockWidgetFeatures features)
参数QDockWidget::DockWidgetFeatures指定窗体的特性,参数包括:
- QDockWidget::DockWidgetClosable:停靠窗体可关闭
- QDockWidget::DockWidgetMovable:停靠窗体可移动
- QDockWidget::DockWidgetFloatable:停靠窗口可浮动
- QDockWidget::AllDockWidgetFeatures:此参数表示拥有停靠窗体的所有特性
- QDockWidget::NoDockWidgetFeatures:不可移动、不可关闭、不可浮动
此参数可采用或(|)的方式对停靠窗体进行特性设定。
(b)setAllowedAreas()方法设置停靠窗体可停靠的区域,原型如下:
void setAllowedAreas(Qt::DockWidgetAreas areas)
参数Qt::DockWidgetAreas指定停靠窗体可停靠的区域,参数包括:
- Qt::LeftDockWidgetArea:可在主窗口的左侧停靠
- Qt::RightDockWidgetArea:可在主窗口的右侧停靠
- Qt::TopDockWidgetArea:可在主窗口的顶部停靠
- Qt::BottomDockWidgetArea:可在主窗口的底部停靠
- Qt::AllDockWidgetArea:可在主窗口任意(以上四个)部位停靠
- Qt::NoDockWidgetArea:只可停靠在插入处
也可采用或(|)的方式进行。
三、堆栈窗体QStackedWidget类
实际应用中,堆栈窗体多与列表框QListWidget及下拉列表框QComboBox配合使用。
代码如下(示例):
stackdlg.h中添加:
#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>
private:
QListWidget *list;
QStackedWidget *stack;
QLabel *label1;
QLabel *label2;
QLabel *label3;
stackdlg.cpp中添加:
#include "stackdlg.h"
#include <QHBoxLayout>
StackDlg::StackDlg(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(QObject::tr("StackedWidget"));
list = new QListWidget(this); //新建一个QListWidget控件对象
//在新建的QListWidget控件中插入三个条目,作为选择项
list->insertItem(0, QObject::tr("Window1"));
list->insertItem(1, QObject::tr("Window2"));
list->insertItem(2, QObject::tr("Window3"));
//创建三个QLabel标签控件对象,作为堆栈窗口需要显示的三层窗体
label1 = new QLabel(QObject::tr("WindowTest1"));
label2 = new QLabel(QObject::tr("WindowTest2"));
label3 = new QLabel(QObject::tr("WindowTest3"));
stack = new QStackedWidget(this); //新建一个QStackedWidget堆栈窗体对象
//将创建的三个QLabel标签控件依次插入堆栈窗体中
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
QHBoxLayout *mainLayout = new QHBoxLayout(this); //对整个对话框进行布局
mainLayout->setMargin(5); //设定对话框(或窗体)的边距为5
mainLayout->setSpacing(5); //设定各个控件之间的间距为5
mainLayout->addWidget(list);
mainLayout->addWidget(stack, 0, Qt::AlignHCenter);
mainLayout->setStretchFactor(list, 1); //(a)
mainLayout->setStretchFactor(stack, 3);
connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));//(b)
}
(a)设定可伸缩控件,第一个参数用于指定设置的控件(序号从0起编号);第二个参数的值大于0则表示此控件为可伸缩控件。
(b)将QListWidget的currentRow()信号与堆栈窗体的setCurrentIndex()槽函数连接起来,实现按选择显示窗体。此处的堆栈窗体index按插入的顺序从0起依次排序,与QListWidget的条目排序相一致。
四、基本布局(QLayout)
Qt提供了QHBoxLayout类、QVBoxLayout类及QGridLayout类等的基本布局管理,分别是水平排列布局、垂直排列布局及网格排列布局。
各种布局的继承关系:
布局中常用的方法有addWidget()和addLayout()。
addWidget()方法用于加入需要布局的控件,方法原型如下:
void addWidget
(
QWidget *widget, //需要插入的控件对象
int formRow, //插入的行
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 //指定对齐方式
)
QHBoxLayout默认采取的是以自左向右的方式顺序排列插入控件或子布局,也可以通过调用setDirection()方法设定排列顺序(如layout->setDirection(QBoxLayout::RightToLeft));
QVBoxLayout默认采用的是以自上而下的方式顺序排列插入控件或子布局,也可以通过调用setDirection()方法设定排列顺序。