十五、窗户割分与停靠窗口

十五、窗户割分与停靠窗口

15.1 窗口割分QSplitter

分割器允许用户通过拖曳子级 Widget 之间的边界控制其大小。单个分割器可以控制任何数量的 Widget。QSplitter 的典型使用是创建几个 Widget 并添加它们使用 insertWidget () 或 addWidget ().

如果调用 insertWidget () 或 addWidget () 时 widget 已经在 QSplitter 内,它将移动到新位置。这可用于稍后在拆分器中对小部件重新排序。您可以使用 indexOf (), widget (),和 count () 来访问拆分器内部的小部件.

默认的 QSplitter 水平(并排)布局其子项;您可以使用 setOrientation ( Qt::Vertical ) 垂直布局其子项。

默认情况下,所有小组件都可以根据用户的意愿大小,介于小组件的 minimumSizeHint () (或 minimumSize ()) 和 maximumSize () 之间。

默认情况下,QSplitter 会动态调整其子级的大小。如果希望 QSplitter 仅在调整大小操作结束时调整子项的大小,请调用 setOpaqueResize (false)。

小组件之间的初始大小分布是通过将初始大小乘以拉伸因子来确定的。您还可以使用 setSizes () 来设置所有小部件的大小。函数 sizes () 返回用户设置的大小。或者,您可以从 QByteArray 中保存和恢复小部件的大小 分别使用 saveState () 和 restoreState ()。

当您隐藏 () 一个子项时,其空间将分配给其他子项。当您再次显示 () 时,它将恢复。

注意: 添加 QLayout 到 QSplitter 是不被支持的 (通过 setLayout () 或使 QSplitter 父级 QLayout );使用 addWidget () 代替 

完成以下功能

创建一个QMainWindow工程

因为是创建了一个窗口,我们应该先把主函数的生成窗口注释,然后直接在mainwindow.cpp中完成代码

首先是创建一个小窗口

    QSplitter *spMainWindow=new QSplitter(Qt::Horizontal,0);
    QTextEdit *textMainWindow=new QTextEdit("左边窗口",spMainWindow);

这时候系统会自动把窗口按照水平分割,无论后面用什么形式给该对象添加分割,该对象都会先以水平分割产生一个窗口,然后把该窗口进行后续对象所需的分割形式进行分割。

接下来进行纵行分割

    QSplitter *spRight=new QSplitter(Qt::Vertical,spMainWindow);
    QTextEdit *textUp=new QTextEdit("右边上窗口",spRight);
    QTextEdit *textDown=new QTextEdit("右边下窗口",spRight);

    QSplitter *spText=new QSplitter(Qt::Vertical,spMainWindow);
    QTextEdit *text1=new QTextEdit("CSDN1",spText);
    QTextEdit *text2=new QTextEdit("CSDN2",spText);

完整代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QSplitter>
#include<QTextEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSplitter *spMainWindow=new QSplitter(Qt::Horizontal,0);
    QTextEdit *textMainWindow=new QTextEdit("左边窗口",spMainWindow);

    QSplitter *spRight=new QSplitter(Qt::Vertical,spMainWindow);
    QTextEdit *textUp=new QTextEdit("右边上窗口",spRight);
    QTextEdit *textDown=new QTextEdit("右边下窗口",spRight);

    QSplitter *spText=new QSplitter(Qt::Vertical,spMainWindow);
    QTextEdit *text1=new QTextEdit("CSDN1",spText);
    QTextEdit *text2=new QTextEdit("CSDN2",spText);




    spMainWindow->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

 15.2 停靠窗口QDockWidget

在这里我们也讲过停靠窗口部件,但是这里有一些补充的函数。

完成以下功能

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QDockWidget>
#include<QTextEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTextEdit *text1=new QTextEdit(this);
    text1->setText("国防科技大学,湖南大选,中南大学");
    text1->setAlignment(Qt::AlignCenter);
    setCentralWidget(text1);

    QDockWidget *dw1=new QDockWidget("停靠窗口1",this);
    dw1->setFeatures(QDockWidget::DockWidgetMovable);
    dw1->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
    QTextEdit *text2=new QTextEdit();
    text2->setText("浙江大学");
    dw1->setWidget(text2);
    addDockWidget(Qt::RightDockWidgetArea,dw1);

    QDockWidget *dw2=new QDockWidget("停靠窗口2",this);
    dw2->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);

    QTextEdit *text3=new QTextEdit();
    text3->setText("复旦大学");
    dw2->setWidget(text3);
    addDockWidget(Qt::RightDockWidgetArea,dw2);
}


MainWindow::~MainWindow()
{
    delete ui;
}

 void QMainWindow::setCentralWidget(QWidget *widget):

将给定的小部件设置为主窗口的中心小部件。
注意:QMainWindow获取小部件指针的所有权,并在适当的时候删除它


void setFeatures(QDockWidget::DockWidgetFeatures features):

此属性用于确定dock小部件是否可移动、可关闭和可浮动
默认情况下,该属性被设置为DockWidgetClosable、DockWidgetMovable和dockwidgetfloatable的组合。


void setAllowedAreas(Qt::DockWidgetAreas areas):

可能放置dock小部件的区域

void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget):

将给定的dockwidget添加到指定区域。

void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation):

按照方向指定的方向将dockwidget添加到给定区域中。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mo Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值