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类也是应用程序中经常用到的,设置停靠窗口的一般流程如下:
创建一个QDockWidget对象的停靠窗体
设置此停靠窗体的属性,通常调用setFeatures()以及setAllowedAreas()两种方法。
新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit。
将控件插入停靠窗体,调用QDockWidget和setWidget()方法。
使用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指定停靠窗体的特性,包括以下几种参数。
QDockWidget::DockWidgetCloseable:停靠窗口可关闭
QDockWidget::DockWidgetMovable:停靠窗口可移动
QDockWidget::DockWidgetFloatable:停靠窗口可浮动
QDockWidget::AllDockWidgetFeatures:停靠窗口拥有所有特性
QDockWidget::NoDockWidgetFeatures:停靠窗口不可关闭不可移动不可浮动
各个位置可以采用或(|)的方式进行
(b)setAllowedAreas()方法设置窗口可停靠的区域,原型如下:
void setAllowedAreas(Qt::DockWidgetAreas areas); 复制代码
参数Qt::DockWidgetAreas指定停靠窗体的特性,包括以下几种参数。
Qt::LeftDockWidgetArea:可在主窗口的左侧停靠
Qt::RightDockWidgetArea:可在主窗口的右侧停靠
Qt::TopDockWidgetArea:可在主窗口的顶端停靠
Qt::BottomDockWidgetArea:可在主窗口的底部停靠
Qt::AllDockWidgetArea:可在主窗口的任意部位停靠
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