文章目录


演示实例:


创建QMainWindow应用, 无UI文件

一、窗口分割 QSplitter

单独修改main.cpp即可

//main.cpp
#include "mainwindow.h"
#include <QApplication>

#include <QSplitter>
#include <QTextCodec>
#include <QTextEdit>
#include <QObject>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

//显示字体
QFont font("宋体",15);

//分割窗口
QSplitter* splitterMain = new QSplitter(Qt::Horizontal,0);//新建水平分割
QTextEdit* textleft = new QTextEdit(QObject::tr("左边窗口"),splitterMain);
textleft->setAlignment(Qt::AlignCenter);


//右边部分分割窗口
QSplitter * splitterRight = new QSplitter(Qt::Vertical,splitterMain);

//设定拓展分割条时,是否实时更新(否则显示一条虚线)
splitterRight->setOpaqueResize(false);

QTextEdit* textUp = new QTextEdit(QObject::tr("右边上半边窗口"),splitterRight);
textUp->setAlignment(Qt::AlignCenter);
QTextEdit* textDown = new QTextEdit(QObject::tr("右边下半边窗口"),splitterRight);
textDown->setAlignment(Qt::AlignCenter);

// 第一个参数用于指定控件序号,第二个参数大于0可伸缩,否则不可伸缩,
splitterMain->setStretchFactor(1,1);
splitterMain->setWindowTitle("splitter实现窗口分割操作");

splitterMain->show();
return a.exec();
}

效果:(可拖拽演示)

Qt(三)窗口分割、停靠、堆叠_控件

二、窗口停靠 QDockWidget

停靠窗口QDockWidget类也是应用程序中经常用到的,设置停靠窗口的一般流程如下:
1、创建一个QDockWidget对象的停靠窗体
2、设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两种方法
3、新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit
4、将控件插入停靠窗体,调用QDockWidget的setWidget()方法
5、使用addDockWidget()方法在MainWindow中加入此停靠窗体

示例说明:


窗口1只可在主窗口的左边和右边停靠;

窗口2只可在浮动和右部停靠两种状态之间切换,并且不可移动


窗口3可实现停靠窗口的各种状态。


单独修改mainwindow.cpp即可

#include "mainwindow.h"
#include <QDockWidget>
#include <QObject>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle("QDockWidget");
QTextEdit *te = new QTextEdit(this);
te->setText("main_window");
te->setAlignment(Qt::AlignCenter);
setCentralWidget(te); //将编辑窗口设置为主窗口的中央窗口

//停靠窗口1
QDockWidget* dock = new QDockWidget("DockWindows1");
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
QTextEdit *te1 = new QTextEdit();
te1->setText("拖拽区域文本1");
dock->setWidget(te1);
addDockWidget(Qt::RightDockWidgetArea,dock);

//停靠窗口2
dock = new QDockWidget("DockWindows1");
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
QTextEdit *te2 = new QTextEdit();
te2->setText("拖拽区域文本2");
dock->setWidget(te2);
addDockWidget(Qt::RightDockWidgetArea,dock);

//停靠窗口3
dock = new QDockWidget("DockWindows1");
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
QTextEdit *te3 = new QTextEdit();
te3->setText("拖拽区域文本3");
dock->setWidget(te3);
addDockWidget(Qt::RightDockWidgetArea,dock);
}

MainWindow::~MainWindow()
{
}

演示效果:

Qt(三)窗口分割、停靠、堆叠_停靠窗口_02

三、窗口堆叠 QStackedWidget

新建【Qt Widgets Application】> 类名【SatckDialog】> 基类【QDialog】> 不选择“创建界面”复选框

#ifndef SATCKDIALOG_H
#define SATCKDIALOG_H

#include <QDialog>
#include <QListWidget>
#include <QLabel>
#include <QStackedWidget>

class SatckDialog : public QDialog
{
Q_OBJECT

public:
SatckDialog(QWidget *parent = nullptr);
QListWidget* list;
QLabel* label1;
QLabel* label2;
QLabel* label3;
QStackedWidget* stack;

~SatckDialog();
};
#endif // SATCKDIALOG_H
#include "satckdialog.h"
#include <QHBoxLayout> //添加布局头文件

SatckDialog::SatckDialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("StackedWidget"));

//新建一个QListWidget控件类对象
list = new QListWidget(this);

//在新建的QListWidget控件中插入三个条目,作为选择项
list->insertItem(0,tr("项目1"));
list->insertItem(1,tr("项目2"));
list->insertItem(2,tr("项目3"));

//创建三个标签控件对象,作为堆栈窗口要显示的三层窗体。
label1 = new QLabel(tr("WindowTest1"));
label2 = new QLabel(tr("WindowTest22"));
label3 = new QLabel(tr("WindowTest333"));


stack = new QStackedWidget(this);//新建QStackedWidget堆栈窗口对象
//将创建的三个标签控件依次插入堆栈窗体
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);


QHBoxLayout *mainLayout = new QHBoxLayout(this); //水平布局
mainLayout->setMargin(10); //设定对话框/窗体的边距
mainLayout->setSpacing(5); //设定各控件的间距
mainLayout->addWidget(list);

mainLayout->addWidget(stack,0,Qt::AlignCenter);//stack添加的label文字居中

mainLayout->setStretchFactor(list,1); //第一个参数用于指定设置的控件(控件序号从0开始),第二个参数大于0表示此控件为可伸缩控件
mainLayout->setStretchFactor(stack,3); //设定可伸缩控件

connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));//按选择显示窗体。堆栈窗体index按插入顺序从0起依次排序,与QListWidget的条目排序一致

}

SatckDialog::~SatckDialog()
{
}

Qt(三)窗口分割、停靠、堆叠_停靠窗口_03