Qt应用之MDI(多文档设计)

qt creator 版本6.8.0  MinGW 64bit

由此模块可以扩展成设计一个qt文本编辑器。

界面如下

部分功能展示如下

新建文件

打开文件

mdi模式、级联模式和平铺模式

界面和程序构建过程。

1.如图所需.cpp和.h文件

2.mainwindow.ui和tformdoc.ui界面布局如下

不懂什么是Action如何建立和使用的请看我的另一篇文章。

tformdoc.h和tformdoc.cpp代码如下

#ifndef TFORMDOC_H
#define TFORMDOC_H#include <QWidget>namespace Ui {
class TFormDoc;
}class TFormDoc : public QWidget
{Q_OBJECTpublic:explicit TFormDoc(QWidget *parent = nullptr);~TFormDoc();void loadFromFile(QString &aFileName);QString currentFileName();bool isFileOpen();void saveToFile();void textEditFont();void textCut();void textCopy();void textPaste();
private:Ui::TFormDoc *ui;QString m_fileName;bool m_fileOpened=false;};#endif // TFORMDOC_H/******************************.cpp********************/#include "tformdoc.h"
#include "ui_tformdoc.h"
#include<QFile>
#include<QFileInfo>
#include<QFontDialog>
TFormDoc::TFormDoc(QWidget *parent): QWidget(parent), ui(new Ui::TFormDoc)
{ui->setupUi(this);setWindowTitle("New Doc[*]");setAttribute(Qt::WA_DeleteOnClose);connect(ui->plainTextEdit,&QPlainTextEdit::modificationChanged,this,&TFormDoc::setWindowModified);
}TFormDoc::~TFormDoc()
{delete ui;
}void TFormDoc::loadFromFile(QString &aFileName)
{QFile aFile(aFileName);if(aFile.open(QIODevice::ReadOnly|QIODevice::Text)){QTextStream aStream(&aFile);ui->plainTextEdit->clear();while(!aStream.atEnd()){ui->plainTextEdit->appendPlainText(aStream.readLine());}aFile.close();QFileInfo fileInfo(aFileName);QString str=fileInfo.fileName();setWindowTitle(str+"[*]");m_fileName=str;m_fileOpened=true;}
}QString TFormDoc::currentFileName()
{return m_fileName;
}bool TFormDoc::isFileOpen()
{return m_fileOpened;
}void TFormDoc::saveToFile()
{setWindowModified(false);
}void TFormDoc::textEditFont()
{QFont font;font=ui->plainTextEdit->font();bool ok=false;font= QFontDialog::getFont(&ok,font);if(ok){ui->plainTextEdit->setFont(font);}
}void TFormDoc::textCut()
{ui->plainTextEdit->cut();
}void TFormDoc::textCopy()
{ui->plainTextEdit->copy();
}void TFormDoc::textPaste()
{ui->plainTextEdit->paste();
}

mainwindow.h和mainwindow.cpp代码如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>class QMdiSubWindow;
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_actDocNew_triggered();void on_actOpen_triggered();void on_actFont_triggered();void on_actCut_triggered();void on_actCopy_triggered();void on_actPaster_triggered();void on_actionViewMode_triggered(bool checked);void on_actTile_triggered();void on_actCascade_triggered();void on_actCloseAll_triggered();void on_actDocSave_triggered();void on_mdiArea_subWindowActivated(QMdiSubWindow *arg1);private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
/***************************************************.cpp*******************************/#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tformdoc.h"
#include<QMdiSubWindow>
#include<QDir>
#include<QFileDialog>
#include<QMdiSubWindow>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setCentralWidget(ui->mdiArea);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actDocNew_triggered()
{TFormDoc *tformDoc=new TFormDoc();ui->mdiArea->addSubWindow(tformDoc);tformDoc->show();ui->actCut->setEnabled(true);ui->actCopy->setEnabled(true);ui->actPaster->setEnabled(true);ui->actFont->setEnabled(true);}void MainWindow::on_actOpen_triggered()
{bool newNeed;TFormDoc *tformDoc;if(ui->mdiArea->subWindowList().size()>0){tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();newNeed=tformDoc->isFileOpen();}else{newNeed=true;}QString curPath=QDir::currentPath();QString aFileName=QFileDialog::getOpenFileName(this,"打开一个文件",curPath,"c程序文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)");if(aFileName.isEmpty())return ;if(newNeed){tformDoc=new TFormDoc(this);ui->mdiArea->addSubWindow(tformDoc);}tformDoc->loadFromFile(aFileName);tformDoc->show();ui->actCopy->setEnabled(true);ui->actPaster->setEnabled(true);ui->actCut->setEnabled(true);ui->actFont->setEnabled(true);
}void MainWindow::on_actFont_triggered()
{TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();tformDoc->textEditFont();
}void MainWindow::on_actCut_triggered()
{TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();tformDoc->textCut();
}void MainWindow::on_actCopy_triggered()
{TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();tformDoc->textCopy();
}void MainWindow::on_actPaster_triggered()
{TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();tformDoc->textPaste();
}void MainWindow::on_actionViewMode_triggered(bool checked)
{if(checked){ui->mdiArea->setViewMode(QMdiArea::TabbedView);}else{ui->mdiArea->setViewMode(QMdiArea::SubWindowView);}ui->mdiArea->setTabsClosable(checked);ui->actCascade->setEnabled(!checked);ui->actTile->setEnabled(!checked);}void MainWindow::on_actTile_triggered()
{ui->mdiArea->tileSubWindows();
}void MainWindow::on_actCascade_triggered()
{ui->mdiArea->cascadeSubWindows();
}void MainWindow::on_actCloseAll_triggered()
{ui->mdiArea->closeAllSubWindows();
}void MainWindow::on_actDocSave_triggered()
{TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();tformDoc->saveToFile();
}void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{Q_UNUSED(arg1);if(ui->mdiArea->subWindowList().size()==0){ui->actCopy->setEnabled(false);ui->actPaster->setEnabled(false);ui->actCut->setEnabled(false);ui->actFont->setEnabled(false);}}

欢迎大家一起交流。

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

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

相关文章

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1&#xff09;基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2&#xff09;分层结构 if 表达式 then 命令表1 else 命令表2 fi 3&#xff09;嵌套结构 if …

Java学习教程,从入门到精通,JDBC驱动程序类型及语法知识点(91)

JDBC驱动程序类型及语法知识点 一、JDBC驱动程序类型 JDBC驱动程序主要有以下四种类型&#xff1a; 1. Type 1&#xff1a;JDBC - ODBC桥驱动程序&#xff08;JDBC - ODBC Bridge Driver&#xff09; 特点&#xff1a;这种驱动程序是Java与ODBC&#xff08;Open Database C…

Linux C 使用ZBar库解析二维码和条形码

1. 编译zbar库 下载 zbar 库源码&#xff0c;这里需要注意下&#xff0c;如果识别的二维码中有中文的话&#xff0c;会出现乱码&#xff0c;一般二维码里中文为UTF-8编码&#xff0c;zbar会默认给你把UTF-8转换为ISO8859-1。有两种解决办法&#xff0c;一是自己再转换一下编码…

【北京迅为】iTOP-4412全能版使用手册-第七十九章 Qt网络编程

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

用python实战excel和word自动化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现excel和word自动化--批量处理 前言--需求快要期末了需要&#xff0c;提交一个年级的学生成绩数据&#xff0c;也就是几百份。当前我们收集了一份excel表格&#xf…

uniapp 预加载分包,减少loading

在 uniapp 中&#xff0c;可以通过配置 pages.json 文件中的 preloadRule 属性来实现页面预加载功能。以下是具体操作步骤&#xff1a; 1. 在 pages.json 中配置 preloadRule preloadRule 用于指定哪些页面需要预加载&#xff0c;以及预加载时机。下面是一个示例配置&#xf…

C++ 智能指针、内存泄露、野指针、悬空指针

智能指针、内存泄露、野指针、悬空指针 内存泄露野指针 、悬空指针野指针悬空指针 智能指针std::unique_ptr创建 指向内存空间其它方法 std::shared_ptr 内存泄露 概念&#xff1a; 内存无法释放 举例&#xff1a; int* p new int[100]; int a{}; p &a;new了一个长度为…

介绍PyTorch张量

介绍PyTorch张量 介绍PyTorch张量 PyTorch张量是我们在PyTorch中编程神经网络时将使用的数据结构。 在编程神经网络时&#xff0c;数据预处理通常是整个过程的第一步&#xff0c;数据预处理的一个目标是将原始输入数据转换为张量形式。 torch.Tensor​类的实例 PyTorch张量…

【R安装】R语言的详细安装及环境配置(2024年11月)

目录 R及Rstudio下载R下载Rstudio下载 R及Rstudio安装R安装Rtools 安装Rstudio安装 运行 RStudio通过RStudio配置使用特定的R版本 参考 R及Rstudio下载 R下载 R官网-The R Project for Statistical Computing 点击【download R】&#xff0c;进入下载界面&#xff1a; 选择…

Docker官网安装

1.官网 官方文档 https://www.docker.com/ Docker Hub官网 镜像 https://hub.docker.com/ 2.Docker 的三要素 1、镜像 2、容器 3、仓库 小总结 3.Docker 平台架构图 &#xff08;架构版本&#xff09; 4.安装Docker CentOS | Docker Docs 1.确定你是CentOS7及以上版本 …

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…

GARCH指导的神经网络在金融市场波动性预测中的应用

“GARCH-Informed Neural Networks for Volatility Prediction in Financial Markets” 论文地址&#xff1a;https://arxiv.org/pdf/2410.00288v1 摘要 波动性作为衡量风险的关键指标&#xff0c;广泛应用于金融投资的定价中。GARCH模型及其变体是用于股票波动性预测的传统工…

STM32-笔记43-低功耗

一、什么是低功耗&#xff1f; 低功耗‌是指通过优化设计和采用特定的技术手段&#xff0c;降低电子设备在运行过程中消耗的能量&#xff0c;从而延长电池寿命、提高性能和减少发热。低功耗设计主要从芯片设计和系统设计两个方面进行&#xff0c;旨在减少所有器件的功率损耗&am…

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像&#xff0c;这个镜像可以是从docker拉取&#xff0c;例如&#xff1a;现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

【Ubuntu 24.04】虚拟机常见问题解决

1.24开启3D加速黑屏 参考文章&#xff1a;Ubuntu24开机黑屏&#xff0c;VMware卡死&#xff0c;虚拟机繁忙解决方案 没有3D加速就没有动画&#xff0c;所以我们需要开启3D加速&#xff0c;但是直接开启3D加速会黑屏 由于Ubuntu24内部的图形加速驱动异常&#xff0c;因此需要更新…

辅助云运维

为客户提供运维支持&#xff0c;保障业务连续性。 文章目录 一、服务范围二、服务内容三、服务流程四、 服务交付件五、责任分工六、 完成标志 一、服务范围 覆盖范围 云产品使用咨询、问题处理、配置指导等&#xff1b; 云产品相关操作的技术指导&#xff1b; 云相关资源日常…

灵活妙想学数学

灵活妙想学数学 题1&#xff1a;海星有几只&#xff1f; 一共有12只海洋生物&#xff0c;分别是5只脚的海星&#xff0c;8只脚的章鱼和10只脚的鱿鱼&#xff0c;这些海洋动物的脚一共有87只&#xff0c;每种生物至少有1只&#xff0c;问海星有几只&#xff1f; 解&#xff1a…

Java中的并发工具类:让多线程编程更轻松

Java中的并发工具类&#xff1a;让多线程编程更轻松 1. 引言&#xff1a;多线程编程的“痛” 多线程编程是Java开发中的一大难点&#xff0c;尤其是在高并发场景下&#xff0c;稍有不慎就会遇到线程安全问题、死锁、性能瓶颈等问题。比如&#xff1a; public class Counter …

Vue3使用vue-count-to数字滚动模块报错解决方案

小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下&#xff1a; TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因&#xff0c;排查还得去看源码&#xff0c;所以我们来解决&a…

idea上git log面板的使用

文章目录 各种颜色含义具体的文件的颜色标签颜色&#x1f3f7;️ 节点和路线 各种颜色含义 具体的文件的颜色 红色&#xff1a;表示还没有 git add 提交到暂存区绿色&#xff1a;表示已经 git add 过&#xff0c;但是从来没有 commit 过蓝色&#xff1a;表示文件有过改动 标…