Qt5 布局(一) 三个常用窗体类
本文通过三个示例介绍一下分割窗口QSplitter类、停靠窗口QDockWidget类以及堆栈窗口QStackedWidget类的使用。
1.分割窗口 QSplitter类
分割窗口QSplitter类在日常开发中非常广泛,它可以灵活分割窗口的布局,经常出现在类似于资源管理器的窗口设计中。
实现一个简单的分割窗口的demo,一个窗口分割成三个子窗口,每个窗口可以随意拖拽大小。
这个案例我们不使用设计器,直接使用编写代码的方式进行实现(创建项目时不需要勾选ui)。
#include mainwindow.h
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFont font(ZYSong18030,12); //显示指定字体
a.setFont(font);
QSplitter *splitterMain = new QSplitter(Qt::Horizontal,0); //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(Bottom Widget),splitterRight);
textUp->setAlignment(Qt::AlignCenter);
QTextEdit *TextBottm = new QTextEdit(QObject::tr(Bottom Widget),splitterRight);
TextBottm->setAlignment(Qt::AlignCenter);
splitterMain->setStretchFactor(1,1); //f
splitterMain->setWindowTitle(QObject::tr(Splitter));
splitterMain->show();
// MainWindow w;
// w.show();
return a.exec();
}
复制代码
a. QSplitter *splitterMain = new QSplitter(Qt::Horizontal,0) 为新建一个QSplitter类对象,作为主分割窗口,设定这个风格窗口为水平的分割窗口
b. QTextEdit *textLeft = new QTextEdit(QObject::tr(Left Widget),splitterMain);
新建了一个TextEdit,将其插入到主分割窗口当中
**c. textLeft->setAlignment(Qt::AlignCenter);**设定QTextEdit中文字的对齐方式,常用到的的有以下几种
- Qt::AlignLeft 左对齐
- Qt::AlignRight 右对齐
- Qt::AlignCenter(HCenter为水平居中 VCenter为垂直居中) 居中
- Qt::AlignUp 文字与顶端对其
- Qt::AlignBottom 文字与底端对其
d.QSplitter *splitterRight = new QSplitter(Qt::Vertical,splitterMain); 新建一个QSplitter类对象,作为右分割窗口,设定这个分割窗口为垂直分割,并以主分割窗口为父窗口
e.splitterRight->setOpaqueResize(false);
调用setOpaqueResize(bool)方法用于设置分割窗口的分割条在拖拽式是否实时更新显示,设定true则为更新显示,若false则为拖拽式显示灰色的线,释放鼠标再显示分割条,默认为true。
f.splitterMain->setStretchFactor(1,1);
setStretchFactor()方法用于设置可伸缩控件,第一个参数用于指定设置的控件序号,控件序号按照插入的先后顺序从0开始排列;第二个参数为大于0的值,标识此控件为可伸缩空间,当整个对话框得宽度发生改变时,左部的文件编辑框宽度保持不变,右部的分割窗口宽度随整个对话框的大小进行调整。
2.停靠窗口 QDockWidget类
停靠窗口QDockWidget类也是应用程序中经常用到的,设置停靠窗口的一般流程如下:
- 创建一个QDockWidget对象的停靠窗体
- 设置此停靠窗体的属性,通常调用setFeatures()以及setAllowedAreas()两种方法。
- 新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit。
- 将控件插入停靠窗体,调用QDockWidget和setWidget()方法。
- 使用addDockWidget()方法在MainWindow中加入此停靠窗体。
示例代码:
#include "dockwindows.h"
#include <QTextEdit>
#include <QDockWidget>
DockWindows::DockWindows(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("DockWindows"));
QTextEdit *te = new QTextEdit(this);
te->setText(tr("Main Window"));
te->setAlignment(Qt::AlignCenter);
setCentralWidget(te);
//停靠窗口1
QDockWidget *dock = new QDockWidget(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("Window1,The dock widget can be moved from the main window,""and floated as ana 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 close,move,and floated"));
dock->setWidget(te3);
addDockWidget(Qt::RightDockWidgetArea,dock);
}
DockWindows::~DockWindows()
{
}
复制代码
- (a):setFeatures()方法设置停靠窗体的特性,原型如下:
void setFeatures(Qt::DockWidgetFeatures features);
复制代码
参数QDockWidget::DockWidgetFeatures指定停靠窗体的特性,包括以下几种参数。
- QDockWidget::DockWidgetCloseable:停靠窗口可关闭
- 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:只能停靠在插入处
各个位置可以采用或(|)的方式进行
3.堆栈窗体QStackedWidget类
也是经常会使用的一类窗体,在实际应用中多与列表框QListWidget以及下拉列表框QComboBox配合使用。
示例:
头文件中代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QListWidget>
#include<QStackedWidget>
#include<QLabel>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QListWidget *list;
QStackedWidget *stack;
QLabel *label1;
QLabel *label2;
QLabel *label3;
};
#endif // MAINWINDOW_H
复制代码
源文件中代码:
#include "mainwindow.h"
#include <QHBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("精彩活动"));
list = new QListWidget(this); //新建一个QListWidget控件对象
//在新建的QListWidget控件中插入三个条目,作为选择项。
list->insertItem(0,tr("活动一"));
list->insertItem(1,tr("活动而二"));
list->insertItem(2,tr("活动三"));
//创建三个QLabel标签控件对象,作为堆栈窗口需要显示的三层窗体。
label1 = new QLabel(tr("送十万"));
label2 = new QLabel(tr("送一亿连抽"));
label3 = new QLabel(tr("送漂亮大个姐姐/帅气强壮大帅哥"));
stack = new QStackedWidget(this); // 新建一个QStackedWidget堆栈窗体对象
//将创建的按个QLabel标签控件依次插入堆栈窗体中
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
QHBoxLayout *mainLayout = new QHBoxLayout(); //对整个对话框进行布局
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)
QWidget *widget = new QWidget();
this->setCentralWidget(widget);
widget->setLayout(mainLayout);
}
MainWindow::~MainWindow()
{
}
复制代码
- (a) 设定可伸缩控件,第一个参数为指定设置的控件,第二个参数大于0则标识可伸缩。
- (b) 连接信号与槽实现点击子项进行跳转,index从0开始排序,需要与QListWidget的条目排序相一致。
近期评论