阅读 158

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的条目排序相一致。


作者:代菜人
链接:https://juejin.cn/post/7031091049766322213


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐