分割窗口QSplitter、停靠窗口QDockWidget和堆栈窗体QStackedWidget

分割窗口QSplitter

直接上示例,内有详细备注。

一个简单的分割窗口功能,整个对话框由三个窗口组成,各窗口之间的大小可随意拖曳改变。

效果图如下:
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* mainSplitter = new QSplitter(Qt::Horizontal, 0);

    //左边的文本编辑框,指定父控件为mainSplitter
    QTextEdit* leftText = new QTextEdit(QObject::tr("left widget"), mainSplitter);
    //设置该编辑框的文本对称方式:居中。 Qt::AlignHCenter 水平居中, Qt::AlignVCenter 垂直居中
    leftText->setAlignment(Qt::AlignCenter);

    //右部分割窗口
    //垂直分割,并指定父控件为主分割窗口,即将右部分割窗口放入主分割窗口中
    QSplitter* rightSplitter = new QSplitter(Qt::Vertical, mainSplitter);

    //右部分割窗口中的两个QTextEdit
    QTextEdit* upText = new QTextEdit(QObject::tr("up widget"), rightSplitter);
    upText->setAlignment(Qt::AlignCenter);

    QTextEdit* bottomText = new QTextEdit(QObject::tr("bottom widget"), rightSplitter);
    bottomText->setAlignment(Qt::AlignCenter);

    //设置右部分割窗口的分割条在拖拽时是否实时更新
    rightSplitter->setOpaqueResize(false);   //不实时更新

    //设置右部分割窗口的伸缩随主窗口改变
    //参数1:表示控件,按插入顺序从0开始 参数2:大于0的值,表示该控件为可伸缩控件
    mainSplitter->setStretchFactor(1, 1);
    //设置主分割窗口的标题
    mainSplitter->setWindowTitle(QObject::tr("Splitter"));
    //因为mainSplitter没有指定父控件,所以需要手动显示
    mainSplitter->show();



    MainWindow w;
    w.show();

    return a.exec();
}

停靠窗口QDockWidget

一个停靠窗口QDockWdiget的使用,一个QMainWindow内有一个QTextEdit作为窗体的主题控件,另新建三个QDockWdiget停靠窗口对象,设置其各自的停靠属性并添加到卖弄Window主窗口中。

效果图如下:
QDockWdiget

代码如下:

#include "dockwindows.h"
#include <QTextEdit>
#include <QDockWidget>
//直接在创建的QMainWindow类的构造中编写,其他文件均不变。
DockWindows::DockWindows(QWidget *parent)
    : QMainWindow(parent)
{
    //设置主窗口标题
    setWindowTitle(tr("DockWindow"));
    //定义一个QTextEdit对象作为主窗口
    QTextEdit* text = new QTextEdit(this);
    //设置该text对象的文本
    text->setText(tr("Main Window"));
    //设置居中显示
    text->setAlignment(Qt::AlignCenter);
    //将text对象设置成主窗口的中央窗口
    setCentralWidget(text);

    //停靠窗口1
    QDockWidget* dock = new QDockWidget(tr("DockWindow1"), this);
    //设置停靠窗口1 的属性为可移动的
    dock->setFeatures(QDockWidget::DockWidgetMovable);
    //设置停靠窗口1的可浮动的区域: 主窗口的左边或者右边
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    //没有指定父对象的QTextEdit1
    QTextEdit* te1 = new QTextEdit();
    te1->setText(tr("Window1, the dock widget can be moved between docks by user"));
    //将te1设置成dock的控件
    dock->setWidget(te1);
    //最后将停靠窗口1添加到主窗口中并制定初始位置:主窗口的右边
    addDockWidget(Qt::RightDockWidgetArea, dock);

    //停靠窗口2
    dock = new QDockWidget(tr("DockWindow2"), this);
    //设置停靠窗口2的属性为可关闭、可浮动
    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 foloated as an independent window, and can be closed"));
    dock->setWidget(te2);
    addDockWidget(Qt::RightDockWidgetArea, dock);

    //停靠窗口3
    dock = new QDockWidget(tr("Window3"), this);
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
    QTextEdit* te3 = new QTextEdit();
    te3->setText(tr("Window3, The dock widget can be closed, moved, and floated"));
    dock->setWidget(te3);
    addDockWidget(Qt::RightDockWidgetArea, dock);

}

堆栈窗体QStackedWdiget

创建一个继承自QDialog的dialog类,内有两个主要控件:QListWidget和QStackedWidget,当选择QListWidget中的item时,切换至QStackedWidget中对应索引的内容。

效果图如下:
QStackedWidget
代码如下:

#ifndef DIALOG_H
#define DIALOG_H

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

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QListWidget* list;
    QStackedWidget* stack;
    QLabel* label1;
    QLabel* label2;
    QLabel* label3;
};
#endif // DIALOG_H
#include "dialog.h"
#include <QHBoxLayout>
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("StackedWidget"));
    list = new QListWidget(this);
    list->insertItem(0, tr("Window1"));
    list->insertItem(1, tr("Window2"));
    list->insertItem(2, tr("Window3"));

    label1 = new QLabel(tr("WindowTest1"));
    label2 = new QLabel(tr("WindowTest2"));
    label3 = new QLabel(tr("WindowTest3"));

    stack = new QStackedWidget(this);
    stack->addWidget(label1);
    stack->addWidget(label2);
    stack->addWidget(label3);

    QHBoxLayout* mainLayout = new QHBoxLayout(this);
    //设置对话框或窗体的边距为5
    mainLayout->setMargin(5);
    //设定各控件之间的间距为5
    mainLayout->setSpacing(5);
    mainLayout->addWidget(list);
    //添加控件, 指定StrechFactor为0表示不可伸缩,
    mainLayout->addWidget(stack, 0, Qt::AlignHCenter);
    //设定可伸缩控件,参数1指定控件(序号从0起编号), 参数2大于0表示此控件可伸缩
    //注意list和stack的伸缩比例为1:3
    mainLayout->setStretchFactor(list, 1);
    mainLayout->setStretchFactor(stack, 3);
    connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));

}

总结

三个小示例仅使用了这三个窗体类中的部分属性及对应常用的接口,具体应用可根据需求查阅Qt的帮助文档。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值