Qt(三)窗口分割、停靠、堆叠
原创
©著作权归作者所有:来自51CTO博客作者SongpingWang的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
演示实例:
创建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();
}
效果:(可拖拽演示)
二、窗口停靠 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()
{
}
演示效果:
三、窗口堆叠 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()
{
}