【嵌入式——QT】MDI应用程序设计

MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并享受主窗口上的工具栏和菜单等操作功能,主窗口上的操作都针对当前活动的MDI子窗口进行。

图示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码示例

QWMainWindow.h

#ifndef QWMAINWINDOW_H
#define QWMAINWINDOW_H#include <QMainWindow>
#include <QMdiSubWindow>
namespace Ui
{class QWMainWindow;
}class QWMainWindow : public QMainWindow
{Q_OBJECTpublic:explicit QWMainWindow(QWidget* parent = nullptr);~QWMainWindow();
public slots :void newDoc();void openDoc();void cutDoc();void copyDoc();void pasteDoc();void fontDoc();void cascadeDemo();void titleDemo();void viewTabDemo();void viewSubDemo();void closeDemo();
private slots:void on_mdiArea_subWindowActivated(QMdiSubWindow* arg1);private:Ui::QWMainWindow* ui;QAction* cutAct;QAction* copyAct ;QAction* pasteAct;QAction* fontAct;QAction* cascadeAct;QAction* titleAct ;QAction* viewTabAct;QAction* viewSuAct;QAction* closeAct;
};#endif // QWMAINWINDOW_H

QWMainWindow.cpp

#include "QWMainWindow.h"
#include "ui_QWMainWindow.h"
#include "QFormDoc.h"
#include <QMdiSubWindow>
#include <QDir>
#include <QFileDialog>
QWMainWindow::QWMainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::QWMainWindow)
{ui->setupUi(this);this->setCentralWidget(ui->mdiArea);// this->setWindowState(Qt::WindowMaximized);ui->toolBar->setToolButtonStyle(Qt::ToolButtonTextOnly);QAction* newDocAct = new QAction(tr("New Doc"), this);connect(newDocAct, SIGNAL(triggered()), this, SLOT(newDoc()));QAction* openDocAct = new QAction(tr("Open Doc"), this);connect(openDocAct, SIGNAL(triggered()), this, SLOT(openDoc()));cutAct = new QAction(tr("Cut"), this);connect(cutAct, SIGNAL(triggered()), this, SLOT(cutDoc()));copyAct = new QAction(tr("Copy"), this);connect(copyAct, SIGNAL(triggered()), this, SLOT(copyDoc()));pasteAct = new QAction(tr("paste"), this);connect(pasteAct, SIGNAL(triggered()), this, SLOT(pasteDoc()));fontAct = new QAction(tr("Font"), this);connect(fontAct, SIGNAL(triggered()), this, SLOT(fontDoc()));cascadeAct = new QAction(tr("Cascade"), this);connect(cascadeAct, SIGNAL(triggered()), this, SLOT(cascadeDemo()));titleAct = new QAction(tr("Title"), this);connect(titleAct, SIGNAL(triggered()), this, SLOT(titleDemo()));viewTabAct = new QAction(tr("MDI Tab"), this);connect(viewTabAct,  &QAction::triggered, this, &QWMainWindow::viewTabDemo);viewSuAct = new QAction(tr("MDI Sub"), this);connect(viewSuAct,  &QAction::triggered, this, &QWMainWindow::viewSubDemo);closeAct = new QAction(tr("Close"), this);connect(closeAct, SIGNAL(triggered()), this, SLOT(closeDemo()));ui->toolBar->addAction(newDocAct);ui->toolBar->addAction(openDocAct);ui->toolBar->addAction(cutAct);ui->toolBar->addAction(copyAct);ui->toolBar->addAction(pasteAct);ui->toolBar->addAction(fontAct);ui->toolBar->addAction(cascadeAct);ui->toolBar->addAction(titleAct);ui->toolBar->addAction(viewTabAct);ui->toolBar->addAction(viewSuAct);ui->toolBar->addAction(closeAct);cutAct->setEnabled(false);copyAct->setEnabled(false);pasteAct->setEnabled(false);fontAct->setEnabled(false);
}QWMainWindow::~QWMainWindow()
{delete ui;
}void QWMainWindow::newDoc()
{QFormDoc* formDoc = new QFormDoc(this);ui->mdiArea->addSubWindow(formDoc);formDoc->show();cutAct->setEnabled(true);copyAct->setEnabled(true);pasteAct->setEnabled(true);fontAct->setEnabled(true);
}void QWMainWindow::openDoc()
{bool needNew = false;QFormDoc* formDoc;if(ui->mdiArea->subWindowList().count() > 0) {formDoc = (QFormDoc*)ui->mdiArea->activeSubWindow()->widget();needNew = formDoc->isFileOpened();} else {needNew = true;}QString curPath = QDir::currentPath();QString fileName = QFileDialog::getOpenFileName(this, u8"打开文件", curPath);if(fileName.isEmpty()) {return;}if(needNew) {formDoc = new QFormDoc(this);ui->mdiArea->addSubWindow(formDoc);}formDoc->loadFromFile(fileName);formDoc->show();cutAct->setEnabled(true);copyAct->setEnabled(true);pasteAct->setEnabled(true);fontAct->setEnabled(true);
}void QWMainWindow::cutDoc()
{QFormDoc* formDoc = (QFormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->textCut();
}void QWMainWindow::copyDoc()
{QFormDoc* formDoc = (QFormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->textCopy();
}void QWMainWindow::pasteDoc()
{QFormDoc* formDoc = (QFormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->textPaste();
}void QWMainWindow::fontDoc()
{QFormDoc* formDoc = (QFormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->setEditFont();
}void QWMainWindow::cascadeDemo()
{ui->mdiArea->cascadeSubWindows();
}void QWMainWindow::titleDemo()
{ui->mdiArea->tileSubWindows();
}void QWMainWindow::viewTabDemo()
{ui->mdiArea->setViewMode(QMdiArea::TabbedView);//Tab多页模式ui->mdiArea->setTabsClosable(true);cascadeAct->setEnabled(false);titleAct->setEnabled(false);
}void QWMainWindow::viewSubDemo()
{ui->mdiArea->setViewMode(QMdiArea::SubWindowView);//子窗口模式cascadeAct->setEnabled(true);titleAct->setEnabled(true);
}void QWMainWindow::closeDemo()
{ui->mdiArea->closeAllSubWindows();
}void QWMainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow* arg1)
{if(ui->mdiArea->subWindowList().count() == 0) {cutAct->setEnabled(false);copyAct->setEnabled(false);pasteAct->setEnabled(false);fontAct->setEnabled(false);ui->statusbar->clearMessage();} else {QFormDoc* formDoc = static_cast<QFormDoc*>(ui->mdiArea->activeSubWindow()->widget());ui->statusbar->showMessage(formDoc->currentFileName());}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型在科技研发与创新中的角色在快速变化

在技术研发与创新中&#xff0c;比如在软件开发、编程工具、科技论文撰写等方面&#xff0c;大语言模型可以辅助工程师和技术专家进行快速的知识检索、代码生成、技术文档编写等工作。在当今的软件工程和研发领域&#xff0c;尤其是随着大语言模型技术的快速发展&#xff0c;它…

【Web】浅聊Java反序列化之Rome——EqualsBeanObjectBean

目录 简介 原理分析 ToStringBean EqualsBean ObjectBean EXP ①EqualsBean直球纯享版 ②EqualsBean配合ObjectBean优化版 ③纯ObjectBean实现版 关于《浅聊Java反序列化》系列&#xff0c;纯是记录自己的学习历程&#xff0c;宥于本人水平有限&#xff0c;内容很水&a…

JWT令牌技术

文章目录 什么是令牌技术为什么需要令牌技术呢JWT 令牌JWT 组成JWT 令牌的使用1. 引入 JWT 依赖生成 JWT 令牌解析 JWT 令牌 什么是令牌技术 令牌技术是一种重要的安全技术&#xff0c;它在多个领域中发挥着关键作用。简单来说&#xff0c;令牌&#xff08;Token&#xff09;可…

大数据冷热分离方案

数据冷热分离方案 1、背景 ​ 随着业务的发展&#xff0c;在线表中的数据会逐渐增加。常规业务都有冷热数据现象明显的特性&#xff08;需要访问的都是近期产生的热数据&#xff1b;时间久远的冷数据出于备份、备案溯源等诉求会进行在线保留&#xff09;。在业务表数据 量可控…

深入理解Java的Writer类

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

LeetCode刷题日志-17.电话号码的字母组合

纯暴力解法&#xff0c;digits有多长&#xff0c;就循环多少次进行字母组合 class Solution {public List<String> letterCombinations(String digits) {List<String> reslut new ArrayList<>();if(digits.equals(""))return reslut;Map<Inte…

Android Studio 检测不到 IDE 更新

点击 Configure updates...&#xff0c;不知道什么时候把 Check for IDE updates 去勾了&#xff0c;一年没有检测到更新&#xff01; 只能重新安装&#xff0c;掉坑里了&#xff01;

云上攻防-云产品篇堡垒机场景JumpServer绿盟SASTeleport麒麟齐治

知识点 1、云产品-堡垒机-产品介绍&攻击事件 2、云产品-堡垒机-安全漏洞&影响产品 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&#xff0c;腾讯…

linuxOPS基础_linux系统注意事项

Linux严格区分大小写 Linux 和Windows不同&#xff0c;Linux严格区分大小写的&#xff0c;包括文件名和目录名、命令、命令选项、配置文件设置选项等。 例如&#xff0c;Win7 系统桌面上有文件夹叫做Test&#xff0c;当我们在桌面上再新建一个名为 test 的文件夹时&#xff0c…

Xilinx 7系列FPGA配置(ug470)

Xilinx 7系列FPGA配置&#xff08;ug470&#xff09; 配置模式串行配置模式接口从-连接方式主-连接方式串行菊花链&#xff08;非同时配置&#xff09;串行配置&#xff08;同时配置&#xff09;时序 主SPI配置模式SPIx1/x2 连接图SPIx1模式时序SPIx4 连接图SPI操作指令操作fla…

深入解读 Elasticsearch 磁盘水位设置

本文将带你通过查看 Elasticsearch 源码来了解磁盘使用阈值在达到每个阶段的处理情况。 跳转文章末尾获取答案 环境 本文使用 Macos 系统测试&#xff0c;512M 的磁盘&#xff0c;目前剩余空间还有 60G 左右&#xff0c;所以按照 Elasticsearch 的设定&#xff0c;ES 中分片应…

什么是ElasticSearch的深度分页问题?如何解决?

在ElasticSearch中进行分页查询通常使用from和size参数。当我们对ElasticSearch发起一个带有分页参数的查询(如使用from和size参数)时,ElasticSearch需要遍历所以匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档 在这个例子中: 1.from 参数定义…

ABAP接口-RFC连接(ABAP TO ABAP)

目录 ABAP接口-RFC连接&#xff08;ABAP TO ABAP&#xff09;创建ABAP连接RFC函数的调用 ABAP接口-RFC连接&#xff08;ABAP TO ABAP&#xff09; 创建ABAP连接 事务代码&#xff1a;SM59 点击创建&#xff0c;填写目标名称&#xff0c;选择连接类型&#xff1a; 填写主机名…

异步编程实战:使用C#实现FTP文件下载及超时控制

博客标题: 异步编程实战&#xff1a;使用C#实现FTP文件下载及超时控制 如果你的函数不是async&#xff0c;你仍然可以实现相同的超时功能&#xff0c;但你将不得不依赖更多的同步代码或使用.Result或.GetAwaiter().GetResult()来阻塞等待任务完成&#xff0c;这可能导致死锁的风…

HarmonyOS(二)Ability应用模型概述

目录 1 Ability概念 2 Ability形态 3 Stage优势 4 Stage模型结构 5 总结 注&#xff1a;本章内容提前声明。 基于HarmonyOS开发者3.1/4.0版本配套的开发者文档&#xff0c;对应API能力级别为API 9 Release。 详情可参考官网API入门第一章应用模型文档中心 1 Ability概念…

苍穹外卖学习-----2024/03/09

1.菜品分页查询 代码在这里 分页查询菜品 2.删除菜品 [链接]param 1、概览 本文将带你了解 Spring 中 RequestParam 注解的用法。 简单地说&#xff0c;可以使用 RequestParam 从请求中提取查询参数、表单参数甚至是多个参数。 2、示例端点 假设我们有一个端点 /api/foos&a…

KVM技术原理及安装KVM并且在KVM里面安装RHEL8

目录 一、kvm原理 1..1虚拟化概念 1.2 虚拟化产生背景 1.3虚拟化架构 1.4主流的虚拟化技术 1.5阐述个人对虚拟化技术的几种分类认知 二、安装KVM并且在KVM里面安装RHEL8 2.1在RHEL8主机上安装KVM 2.2安装完成后&#xff0c;使用virt-manager命令打开虚拟机管理图形界面…

Anaconda prompt运行打开jupyter notebook 指令出错解决方案

一、打不开jupyter notebook网页 报错如下&#xff1a; Traceback (most recent call last): File “D:\anaconda3\lib\site-packages\notebook\traittypes.py”, line 235, in _resolve_classes klass self._resolve_string(klass) File “C:\Users\DELL\AppData\Roaming\Py…

题目:泡澡(蓝桥OJ 3898)

问题描述&#xff1a; 解题思路&#xff1a; 图解&#xff1a;&#xff08;以题目样例为例子&#xff09; 注意点&#xff1a;题目的W是每分钟最大出水量&#xff0c;因此有一分钟的用水量大于出水量则不通过。 补充&#xff1a;差分一般用于对一段区间每个元素加相同值&#x…

Android 14 设置锁屏为NONE后开启双卡PIN锁,重启设备后,输完卡1的PIN码就进入了安卓界面,未提示输入卡2的PIN码

一.问题背景 目前在多个Android14平台发现开启双卡PIN码并且关闭屏幕锁的情况下,第二个PIN码锁输入弹框不能弹出问题,导致第二个卡不能注网。 如下是未修改前重启后解锁卡1PIN码的状态 可以看出卡2不能正常使用 二.何处关闭了卡2的PIN锁? 1.添加日志 首先在KeyguardSecu…