Qt5布局(一)三个常用窗体类Qt5布局(一)三个

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类也是应用程序中经常用到的,设置停靠窗口的一般流程如下:

  1. 创建一个QDockWidget对象的停靠窗体
  2. 设置此停靠窗体的属性,通常调用setFeatures()以及setAllowedAreas()两种方法。
  3. 新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit。
  4. 将控件插入停靠窗体,调用QDockWidget和setWidget()方法。
  5. 使用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指定停靠窗体的特性,包括以下几种参数。

  1. QDockWidget::DockWidgetCloseable:停靠窗口可关闭
  2. QDockWidget::DockWidgetMovable:停靠窗口可移动
  3. QDockWidget::DockWidgetFloatable:停靠窗口可浮动
  4. QDockWidget::AllDockWidgetFeatures:停靠窗口拥有所有特性
  5. QDockWidget::NoDockWidgetFeatures:停靠窗口不可关闭不可移动不可浮动

各个位置可以采用(|)的方式进行

  • (b)setAllowedAreas()方法设置窗口可停靠的区域,原型如下:
void setAllowedAreas(Qt::DockWidgetAreas areas);
复制代码

参数Qt::DockWidgetAreas指定停靠窗体的特性,包括以下几种参数。

  1. Qt::LeftDockWidgetArea:可在主窗口的左侧停靠
  2. Qt::RightDockWidgetArea:可在主窗口的右侧停靠
  3. Qt::TopDockWidgetArea:可在主窗口的顶端停靠
  4. Qt::BottomDockWidgetArea:可在主窗口的底部停靠
  5. Qt::AllDockWidgetArea:可在主窗口的任意部位停靠
  6. 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的条目排序相一致。