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

本文主要是介绍分割窗口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);//左边的文本编辑框,指定父控件为mainSplitterQTextEdit* leftText = new QTextEdit(QObject::tr("left widget"), mainSplitter);//设置该编辑框的文本对称方式:居中。 Qt::AlignHCenter 水平居中, Qt::AlignVCenter 垂直居中leftText->setAlignment(Qt::AlignCenter);//右部分割窗口//垂直分割,并指定父控件为主分割窗口,即将右部分割窗口放入主分割窗口中QSplitter* rightSplitter = new QSplitter(Qt::Vertical, mainSplitter);//右部分割窗口中的两个QTextEditQTextEdit* 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);//停靠窗口1QDockWidget* dock = new QDockWidget(tr("DockWindow1"), this);//设置停靠窗口1 的属性为可移动的dock->setFeatures(QDockWidget::DockWidgetMovable);//设置停靠窗口1的可浮动的区域: 主窗口的左边或者右边dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//没有指定父对象的QTextEdit1QTextEdit* 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);//停靠窗口2dock = 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);//停靠窗口3dock = 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_OBJECTpublic: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);//设置对话框或窗体的边距为5mainLayout->setMargin(5);//设定各控件之间的间距为5mainLayout->setSpacing(5);mainLayout->addWidget(list);//添加控件, 指定StrechFactor为0表示不可伸缩,mainLayout->addWidget(stack, 0, Qt::AlignHCenter);//设定可伸缩控件,参数1指定控件(序号从0起编号), 参数2大于0表示此控件可伸缩//注意list和stack的伸缩比例为1:3mainLayout->setStretchFactor(list, 1);mainLayout->setStretchFactor(stack, 3);connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));}

总结

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

这篇关于分割窗口QSplitter、停靠窗口QDockWidget和堆栈窗体QStackedWidget的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/605895

相关文章

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

主窗口的设计与开发(二)

主窗口的设计与开发(二) 前言         在上一集当中,我们完成了主窗口的初始化,主窗口包括了左中右三个区域。我们还完成了对左窗口的初始化,左窗口包括了用户头像、会话标签页按钮、好友标签页按钮以及好友申请标签页按钮。对于切换每个标签页,我们还做了初始化信号槽的内容。最后我们将整个MainWidget类设置为单例模式。         那么这一集我们将继续完成主窗口的设计与开发,这一集我

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.

基于YOLO8的图片实例分割系统

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 segment_app.py 二、核心代码介绍篇2.1 segment_app.py2.2 scan_taskflow.py 三、结语 代码资源:计算机视觉领域YOLO8技术的图片实例分割实

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

运行.bat文件,如何在Dos窗口里面得到该文件的路径

把java代码打包成.jar文件,编写一个.bat文件,执行该文件,编译.jar包;(.bat,.jar放在同一个文件夹下) 运行.bat文件,如何在Dos窗口里面得到该文件的路径,并运行.jar文件: echo 当前盘符:%~d0 echo 当前路径:%cd% echo 当前执行命令行:%0 echo 当前bat文件路径:%~dp0 echo 当前bat文件短路径:%~sdp0 nc

类codepen的实现可拖拽窗口demo

首先说下思想 flex或者其他布局方式,实现左右分割布局,主盒子宽度100%,左右布局中包含一个分割条(可在布局容器中,也可以单独定义)为分隔条绑定鼠标点击事件,为document绑定鼠标移动事件和鼠标放开事件,通过监听鼠标移动事件和上一个状态保存下来的鼠标位置作对比,判断当前鼠标移动方向(往左还是往右)然后计算当前鼠标位置和鼠标点击位置的距离,来计算左右容器的变化,然后通过dom的方式设置宽度