【Qt控件之QMdiArea】介绍及使用

news2024/12/23 23:36:57

描述

QMdiArea小部件提供了一个区域,用于显示MDI窗口。QMdiArea的功能类似于MDI窗口的窗口管理器。例如,它在自身上绘制和排列管理的窗口,可以按级联或平铺模式排列它们。通常,QMdiArea被用作QMainWindow的中心小部件,用于创建MDI应用程序,但也可以放置在任何布局中。下面的代码向主窗口添加了一个MDI区域:

QMainWindow *mainWindow = new QMainWindow;
mainWindow->setCentralWidget(mdiArea);

与顶级窗口的窗口管理器不同,QMdiArea支持所有窗口标志(Qt::WindowFlags),只要这些标志被当前小部件样式支持。如果某个特定的标志在样式中不受支持(如WindowShadeButtonHint),您仍然可以使用showShaded()来收起窗口。

以上这段话理解就是:
QMdiArea(一个Qt库中的类,用于创建多文档界面(MDI)应用程序的主窗口区域)支持所有的窗口标志(Qt::WindowFlags),但是这些标志是否能被正确使用还取决于当前窗口部件(Widget)的样式是否支持这些标志。有些窗口标志可能在某些样式中不被支持,比如“WindowShadeButtonHint”。

“WindowShadeButtonHint”这个窗口标志是用来表示窗口是否有一个按钮可以用来控制窗口的阴影效果的。但是,如果这个标志在当前使用的样式中不被支持,也就是说,即使你设置了这个标志,你可能也看不到相应的阴影按钮。

然而,尽管这个标志在样式中不受支持,你仍然可以使用showShaded()函数来收起(或展开)窗口。也就是说,尽管你可能看不到阴影按钮,但是你仍然可以通过代码来控制窗口的阴影效果。

总的来说,这句话是在说明QMdiArea的窗口标志支持和样式的关系,以及当某些标志不被样式支持时的处理方式。

QMdiArea中,子窗口是QMdiSubWindow的实例。可以使用addSubWindow()将它们添加到MDI区域中。通常,会将一个QWidget作为内部小部件传递给此函数,但也可以直接传递一个QMdiSubWindow。此类继承自QWidget,您可以像处理普通顶级窗口一样使用相同的API进行编程。QMdiSubWindow还具有特定于MDI窗口的行为。有关更多详细信息,请参阅QMdiSubWindow类描述。

当子窗口获得键盘焦点或调用setFocus()时,它将变为活动窗口。用户可以通过通常的方法来激活窗口。当活动窗口更改时,MDI区域会发出subWindowActivated()信号,activeSubWindow()函数返回活动子窗口。

方便的函数subWindowList()返回所有子窗口的列表。例如,这些信息可以用于弹出菜单中包含窗口列表的情况。

子窗口按当前的窗口顺序进行排序。这用于subWindowList()以及activateNextSubWindow()activatePreviousSubWindow(),也用于使用cascadeSubWindows()tileSubWindows()级联或平铺窗口的情况。

QMdiArea提供了两种内置的子窗口布局策略:cascadeSubWindows()tileSubWindows()。它们都是槽函数,并且可以轻松地连接到菜单项。
在这里插入图片描述

常用函数

以下是QMdiArea的常用函数、信号和槽的介绍:

成员函数
  • addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::EmptyFlag):将一个QWidget添加为子窗口,并返回对应的QMdiSubWindow实例。
  • removeSubWindow(QWidget *widget):从MDI区域中移除指定的子窗口。
  • setActiveSubWindow(QMdiSubWindow *window):将指定的QMdiSubWindow设置为活动窗口。
  • cascadeSubWindows():级联排列所有子窗口。
  • tileSubWindows():平铺排列所有子窗口。
  • subWindowList():返回包含所有子窗口的列表。
  • activeSubWindow():返回当前活动的子窗口。
信号
  • subWindowActivated(QMdiSubWindow *window):当活动窗口发生变化时触发该信号,参数为当前活动的子窗口。
  • subWindowActivated(QWidget *window):重载版本的subWindowActivated信号,参数为当前活动的子窗口的内部小部件。
  • subWindowAboutToActivate(QMdiSubWindow *window):在即将激活子窗口之前触发该信号,参数为即将激活的子窗口。
  • subWindowAboutToActivate(QWidget *window):重载版本的subWindowAboutToActivate信号,参数为即将激活的子窗口的内部小部件。
  • cascadeSubWindows():槽函数,用于级联排列所有子窗口。
  • tileSubWindows():槽函数,用于平铺排列所有子窗口。
  • activateNextSubWindow():槽函数,激活下一个子窗口。
  • activatePreviousSubWindow():槽函数,激活上一个子窗口。

除了上述函数、信号和槽之外,QMdiArea还具有一些其他函数用于设置和查询MDI区域的属性,例如设置背景颜色、设置视图模式、获取焦点子窗口等。可以参考Qt官方文档中的QMdiArea类文档以获取更详细的信息和完整的函数、信号和槽列表。

示例

以下示例,实现使用QMdiArea实现添加子窗口、删除子窗口、设置背景样式和平铺子窗口等功能:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow mainWindow;

    QMdiArea mdiArea;
    mainWindow.setCentralWidget(&mdiArea);

    // 设置背景样式
    mdiArea.setStyleSheet("background-color: #e9e9e9;");

    // 添加子窗口
    QWidget *subWindow1 = new QWidget;
    subWindow1->setWindowTitle("SubWindow 1");
    QLabel *label1 = new QLabel("This is SubWindow 1");
    label1->setAlignment(Qt::AlignCenter);
    QVBoxLayout *layout1 = new QVBoxLayout(subWindow1);
    layout1->addWidget(label1);
    mdiArea.addSubWindow(subWindow1);

    QWidget *subWindow2 = new QWidget;
    subWindow2->setWindowTitle("SubWindow 2");
    QLabel *label2 = new QLabel("This is SubWindow 2");
    label2->setAlignment(Qt::AlignCenter);
    QVBoxLayout *layout2 = new QVBoxLayout(subWindow2);
    layout2->addWidget(label2);
    mdiArea.addSubWindow(subWindow2);

    // 显示主窗口和子窗口
    mainWindow.show();

    // 平铺子窗口
    mdiArea.tileSubWindows();

    // 删除子窗口
    mdiArea.removeSubWindow(subWindow1);

    return app.exec();
}

在这里插入图片描述

在示例中,使用QMdiArea来创建一个MDI区域,并将其设置为主窗口的中心小部件。通过设置QMdiArea的样式表来定制背景样式。然后,使用QWidget来创建两个子窗口,并将它们添加到MDI区域中使用addSubWindow()函数。最后,调用tileSubWindows()函数来平铺子窗口,并在需要时使用removeSubWindow()函数来删除子窗口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1120370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5算法改进(17)— 手把手教你去更换损失函数(IoU/GIoU/DIoU/CIoU/EIoU/AlphaIoU/SIoU)

前言:Hello大家好,我是小哥谈。损失函数(loss function)是机器学习中用来衡量模型预测值与真实值之间差异的函数。它用于度量模型在训练过程中的性能,以便优化模型参数。在训练过程中,损失函数会根据模型的预测结果和真实标签计算出一个标量值,代表了模型预测的错误程度…

离散低通滤波方法

低通滤波器允许低频信号通过&#xff0c;并抑制高频信号。其核心思想是在频率域上通过移除高频成分来平滑信号。这在去噪、平滑和提取基本频率成分时非常有用。 离散低通滤波方法通常采用一阶低通滤波器进行处理。一阶低通滤波器是一种常见的数字滤波器&#xff0c;能够将信号…

分享 | 对 电商API 平台的再思考

API 是推动现代企业数字化转型的基础。它不但连接了内部应用程序、合作伙伴和客户&#xff0c;同时也快速持续地向市场提供了各种新产品、版本和功能。 但当下还是以集中式的 API 交付为主。一个企业的对外 API 交付过程通常都是冗余而繁琐的&#xff0c;对企业内部的敏捷性、速…

数据丢失恢复怎么操作好?五种方法帮您恢复数据

丢失文件可能会造成灾难性的后果&#xff0c;因此您绝对需要最好的 PC 恢复软件。数据恢复软件必须快速、可靠并涵盖大多数文件格式。我们列表中最好的工具是一个甚至可以检索隐藏文件的解决方案。我们选择的另一个解决方案能够恢复700 多种独特的文件格式。 这种噩梦可能发生…

通过WinSCP实现Windows给Ubuntu(Linux)虚拟机传输数据

要实现传输有几个准备工作需要做 1.在虚拟机运行工具&#xff08;VMware或者其他&#xff09;中设置网络&#xff08;或者网络适配器&#xff09;为桥接模式&#xff08;之前是NAT模式&#xff09; 2.使用ifconfig命令查看虚拟机的网络地址 3.确定虚拟机中安装了ssh 安装 sudo…

数组问题答疑

在对数组有一定了解后我们会遇到一些问题&#xff0c;本文章将尽可能的讲解一些常见错误。 文章目录 1.数组名&#xff0c;&数组名分别代表什么&#xff1f;2.数组形式做形参时是传的整个数组还是首元素地址&#xff1f;3.为什么在主函数中用sizeof(arr)计算出的结果是整个…

登上抖音热搜榜:如何让你的内容火爆全网

在当今信息爆炸的时代&#xff0c;抖音已经成为了很多人获取信息、娱乐和社交的重要平台。每一天&#xff0c;都有大量的短视频在抖音上诞生&#xff0c;然而&#xff0c;只有少数幸运儿能够登上抖音热搜榜&#xff0c;成为万人瞩目的焦点。那么&#xff0c;如何让你的内容火爆…

【设计模式】解释器模式

文章目录 1.解释器模式定义2.解释器模式的角色3.解释器模式实战案例3.1.场景说明3.2.结构类图3.3.代码实现 4.解释器模式优缺点5.解释器模式适用场景6.解释器模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.解释器模式定义 解析器模式&#xff08;Interpreter Pattern&a…

我国跨境电商行业研究报告(2022)

我国跨境电商行业研究报告 我国跨境电商规模突飞猛进&#xff0c;2022年进出口规模超2万亿元&#xff0c;2023年上半年跨境电商出口8210亿元&#xff0c;增长19.9%。全国跨境电商主体已超10万家&#xff0c;近年来涌现出一批上市公司&#xff0c;以及广州希音等全球独角兽企业。…

Java后端模拟面试 题集④

1.你先作个自我介绍吧 面试官您好&#xff0c;我叫张睿超&#xff0c;来自湖南长沙&#xff0c;大学毕业于湖南农业大学&#xff0c;是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图…

AD20 ~PCB封装库的制作

1、打开“51单片机最小系统”的工程文件。 2、创建PCB库文件&#xff1a;单击“文件”菜单&#xff0c;选择“新的”选项中的“库”选项&#xff0c;再选择“PCB 元件库”&#xff0c;进入元件PCB封装的编辑界面。 3、保存PCB库文件&#xff1a;选择“文件”菜单&#xff0c;选…

OpenCV实战——使用YOLO进行目标检测

OpenCV实战——使用YOLO进行目标检测 0. 前言1. YOLO 模型简介2. 基于 YOLO 实现目标检测3. 完整代码相关链接 0. 前言 在本节中&#xff0c;我们将使用 YOLO 算法执行目标检测。目标检测是计算机视觉中的一项常见任务&#xff0c;借助深度学习技术&#xff0c;我们可以实现高…

Vue虚拟节点和渲染函数

1.虚拟节点 虚拟节点&#xff08;dom&#xff09;本质上就是一个普通的JS对象&#xff0c;用于描述视图的界面结构 2.渲染函数render()&#xff1a;接收一个 createElement()函数创建的VNode Vue.component("board", {render: function(createElement) {return cr…

025-第三代软件开发-实现需求长时间未操作返回登录界面

第三代软件开发-实现需求长时间未操作返回登录界面 文章目录 第三代软件开发-实现需求长时间未操作返回登录界面项目介绍实现需求长时间未操作返回登录界面实现思路用户操作监控QML 逻辑处理 关键字&#xff1a; Qt、 Qml、 QTimer、 timeout、 eventFilter 项目介绍 欢迎…

【Linux】文件权限、目录权限、掩码、粘滞位以及相关指令

文章目录 Linux权限两种用户Linux权限管理三个问题:什么是权限呢?三种角色是什么:那么为什么存在所属组呢? 文件类型和访问权限&#xff08;事物属性&#xff09;a) 文件类型b)基本权限 文件权限值的表示方法文件访问权限的相关设置方法a)chmodb)chownc)chgrp 权限掩码d)umas…

第87步 时间序列建模实战:LSTM回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍大名鼎鼎的LSTM回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal…

UVM-什么是UVM方法学

概念简介 百度对UVM的解释如下&#xff1a; 通用验证方法学&#xff08;Universal Verification Methodology, UVM&#xff09;是一个以SystemVerilog类库为主体的验证平台开发框架&#xff0c;验证工程师可以利用其可重用组件构建具有标准化层次结构和接口的功能验证环境 UVM…

C/C++文件操作————写文件与读文件以及通讯录的改进 (保姆级教学)

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.写文件函数与读文件函数 …

打印新闻标题,使用封装get、set方法,打印前15个字符串

package day21; import java.util.ArrayList; import java.util.Collections;/*** author monian* Wo yi wu ta,wei shou shu er!*/ public class Homework01 {SuppressWarnings({"all"})public static void main(String[] args) {News news1 new News("新冠确…

Typora的相关配置(Typora主题、字体、快捷键、习惯)

Typora的相关配置(Typora主题、字体、快捷键、习惯) 文章目录 Typora的相关配置(Typora主题、字体、快捷键、习惯)[toc]一、主题配置二、字体配置查看字体名称是否可以被识别&#xff1a;如果未能正确识别&#xff1a; 三、习惯配置四、快捷键配置更改提供的功能的快捷键&#…