【qt】MDI多文档界面开发

MDI多文档界面开发

  • 一.应用场景
  • 二.界面设计
  • 三.界面类设计
  • 四.实现功能
    • 1.新建文档
    • 2.打开文件
    • 3.关闭所有
    • 4.编辑功能
    • 5.MDI页模式
    • 6.瀑布展开模式
    • 7.平铺模式
  • 五.总结

一.应用场景

类似于vs的界面功能,工具栏的功能可以对每个文档使用!

在这里插入图片描述

二.界面设计

老规矩,边做项目边学!
目标图:
在这里插入图片描述
需要蔬菜的可以dd我!

界面设计:
在这里插入图片描述
同时设为中心组件和最大化的状态设置!

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setCentralWidget(ui->mdiArea);
    setWindowState(Qt::WindowMaximized);
}

三.界面类设计

在这里插入图片描述
添加一个纯文本编辑器
在这里插入图片描述
并设置窗口边距:
在这里插入图片描述

四.实现功能

1.新建文档

注意界面类设计的头文件.
在这里插入图片描述
运行结果:
在这里插入图片描述

2.打开文件

先来说一说打开文件的逻辑
如果没有窗口,就先新建一个窗口,再将文件内容写入
如果有窗口,看是否已经写入了文件,如果有就重新创建一个窗口
没有写入就直接写入.

#include "formdoc.h"
#include <QMdiSubWindow>
#include <QFileDialog>
....
void MainWindow::on_actionOpen_triggered()
{
    bool needForm=false;//是否需要新建窗口
    FormDoc*form=NULL;//变化的指向

    if(ui->mdiArea->subWindowList().count()==0)//如果没有窗口就要新建
    {
        needForm=true;
    }
    else//有窗口的情况下
    {
        form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//指向激活的窗口,也就是当前点击的子窗口,需要用到头文件
        if(form->fileWrite())//如果文件已经写入就需要重新创建一个窗口
        {
            needForm=true;
        }
    }

    //获取文件路径名
    QString fileName=QFileDialog::getOpenFileName(this,"打开一个文件",QDir::currentPath(),
                                                  "源文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)");
    if(fileName.isEmpty())
    {
        return;
    }


    if(needForm)
    {
        form=new FormDoc(this);//创建新的窗口
        ui->mdiArea->addSubWindow(form);//添加到MDI容器
    }

    form->loadFile(fileName);//将文件写入窗口
    form->show();

}

面向对象的思想对formDoc窗口进行操作和读取数据.

#ifndef FORMDOC_H
#define FORMDOC_H

#include <QWidget>

namespace Ui {
class FormDoc;
}

class FormDoc : public QWidget
{
    Q_OBJECT

public:
    explicit FormDoc(QWidget *parent = nullptr);
    ~FormDoc();

    bool fileWrite();//文件是否写入
    void loadFile(const QString&fileName);//写入文件到窗口

private:
    Ui::FormDoc *ui;
    bool m_fileWrite=false;
};

#endif // FORMDOC_H

函数实现:

#include <QTextStream>
#include <QFileInfo>
...
bool FormDoc::fileWrite()
{
    return this->m_fileWrite;
}

void FormDoc::loadFile(const QString&fileName)
{
    QFile file(fileName);
    if(file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        QTextStream stream(&file);
        ui->plainTextEdit->clear();
        //读取所有的文件内容写入到窗口中
        ui->plainTextEdit->setPlainText(stream.readAll());
        file.close();

        //设置窗口的主题
        QFileInfo fileName;
        QString name=fileName.fileName();
        this->setWindowTitle(name);

        //写了文件,姚重新创造一个窗口
        this->m_fileWrite=true;
    }
}

运行结果:
在这里插入图片描述

3.关闭所有

void MainWindow::on_actionCloseAll_triggered()
{
    ui->mdiArea->closeAllSubWindows();
}

4.编辑功能

因为纯文本编辑器组件本来就有这些功能,所以我们可以用面向对象的思想在formdoc窗口来设置接口!

void MainWindow::on_actionCut_triggered()
{
    FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体
    form->cut();
}

void MainWindow::on_actionCopy_triggered()
{
    FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体
    form->copy();
}

void MainWindow::on_actionPaste_triggered()
{
    FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体
    form->paste();
}

void MainWindow::on_actionFont_triggered()
{
    FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体
    form->setFont();
}

formdoc.h

#ifndef FORMDOC_H
#define FORMDOC_H

#include <QWidget>

namespace Ui {
class FormDoc;
}

class FormDoc : public QWidget
{
    Q_OBJECT

public:
    explicit FormDoc(QWidget *parent = nullptr);
    ~FormDoc();

    bool fileWrite();//文件是否写入
    void loadFile(const QString&fileName);//写入文件到窗口
    
    void cut();
    void copy();
    void paste();
    void setFont();

private:
    Ui::FormDoc *ui;
    bool m_fileWrite=false;
};

#endif // FORMDOC_H

formdoc.cpp

#include "formdoc.h"
#include "ui_formdoc.h"
#include <QTextStream>
#include <QFileInfo>
#include <QFontDialog>

FormDoc::FormDoc(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormDoc)
{
    ui->setupUi(this);
    this->setAttribute(Qt::WA_DeleteOnClose);//关闭窗口时同时销毁
}

FormDoc::~FormDoc()
{
    delete ui;
}

bool FormDoc::fileWrite()
{
    return this->m_fileWrite;
}

void FormDoc::loadFile(const QString&fileName)
{
    QFile file(fileName);
    if(file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        QTextStream stream(&file);
        ui->plainTextEdit->clear();
        //读取所有的文件内容写入到窗口中
        ui->plainTextEdit->setPlainText(stream.readAll());
        file.close();

        //设置窗口的主题
        QFileInfo fileName;
        QString name=fileName.fileName();
        this->setWindowTitle(name);

        //写了文件,姚重新创造一个窗口
        this->m_fileWrite=true;
    }
}

void FormDoc::cut()
{
    ui->plainTextEdit->cut();
}
void FormDoc::copy()
{
    ui->plainTextEdit->copy();
}
void FormDoc::paste()
{
    ui->plainTextEdit->paste();
}
void FormDoc::setFont()
{
    bool ok;
    QFont font=ui->plainTextEdit->font();
    font=QFontDialog::getFont(&ok,font);
    ui->plainTextEdit->setFont(font);
}

运行结果:
在这里插入图片描述

5.MDI页模式

void MainWindow::on_actionMDI_triggered(bool checked)
{
    if(checked)
    {
        ui->mdiArea->setViewMode(QMdiArea::TabbedView);//设置为页面模式
        //页面模式不能使用展开和平铺
        ui->actionShow->setEnabled(false);
        ui->actionTile->setEnabled(false);
        ui->mdiArea->setTabsClosable(true);//页有关闭按钮
    }
    else
    {
        ui->mdiArea->setViewMode(QMdiArea::SubWindowView);//设置为页面模式        
        ui->actionShow->setEnabled(true);
        ui->actionTile->setEnabled(true);
        ui->mdiArea->setTabsClosable(false);//页有关闭按钮
    }
}

运行结果:
在这里插入图片描述

6.瀑布展开模式

void MainWindow::on_actionShow_triggered()
{
    ui->mdiArea->cascadeSubWindows();
}

运行结果:
在这里插入图片描述

7.平铺模式

void MainWindow::on_actionTile_triggered()
{
    ui->mdiArea->tileSubWindows();
}

运行结果:
在这里插入图片描述
哈哈,搞完了,感觉有的像监控,哈哈!

五.总结

Qt提供了MDI(多文档界面),可以更方便的实现多个窗口的开发
MDI使用QMdiArea作为多个子窗体的容器。
这些子窗体,可以同享使用主窗体的工具栏和菜单栏,
适合,需要进行多个文档编辑的场景,类似VS的编辑界面。

安静 既是道路,也是终点!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年人力资源与社会治理国际会议(ICHRSG 2024)

2024年人力资源与社会治理国际会议 2024 International Conference on Human Resources and Social Governance 会议简介 2024年人力资源与社会治理国际会议是一个聚焦全球人力资源发展与社会治理创新的高端交流平台。本次会议汇集了全球顶尖的专家学者、企业高管和政策制定者&…

Transformer学习之SwinTransformer

1.算法简介 本文主要参考自以下链接&#xff0c;整理成线上的形式用于备忘&#xff0c;排版太麻烦了直接贴图&#xff0c;参考的朋友慎重&#xff0c;不如直接看参考链接&#xff0c;后期有了新的理解继续更正。 参考链接1&#xff1a;Swin-Transformer网络结构详解_swin tran…

智能售货机的商业潜力

智能售货机的商业潜力 1. 即时购物体验&#xff1a;在快节奏的生活中&#xff0c;人们往往缺乏闲暇去超市购物。智能售货机以其便捷性&#xff0c;提供了一种快速获取商品的方式&#xff0c;只需简单几步即可完成购买。 2. 全天候服务&#xff1a;智能售货机不受时间限制&…

鸿蒙轻内核M核源码分析系列九 互斥锁Mutex

多任务环境下会存在多个任务访问同一公共资源的场景&#xff0c;而有些公共资源是非共享的临界资源&#xff0c;只能被独占使用。鸿蒙轻内核使用互斥锁来避免这种冲突&#xff0c;互斥锁是一种特殊的二值性信号量&#xff0c;用于实现对临界资源的独占式处理。另外&#xff0c;…

使用JMeter软件压测接口配置说明

1、下载完该软件https://blog.csdn.net/wust_lh/article/details/86095924 2.点击bin文件中jmeter.bat脚本https://blog.csdn.net/wust_lh/article/details/86095924 3.官网地址https://jmeter.apache.org/download_jmeter.cgi 通过 【Options】->【Choose Language】变更为…

【调试笔记-20240606-Linux-为 OpenWrt 的 nginx 服务器添加Shell CGI 支持】

调试笔记-系列文章目录 调试笔记-20240606-Linux-为 OpenWrt 的 nginx 服务器添加Shell CGI 支持 文章目录 调试笔记-系列文章目录调试笔记-20240606-Linux-为 OpenWrt 的 nginx 服务器添加Shell CGI 支持 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试…

flutter日历范围选择器

1.传入日期跨度&#xff0c;选择上架日期时&#xff0c;自动显示下架日期 2.手动选择上架日期和下架日期(图中下架日期自动填了只需CalendarDateRangePicker在initState方法中使用_startDate widget.initialStartDate; _endDate widget.initialEndDate;&#xff0c;而不直接…

人工智能绘画的历史

人工智能绘画的起源可以追溯到20世纪50年代。当时&#xff0c;艺术家和科学家开始使用计算机生成图像和图形&#xff0c;将绘画艺术与技术领域相结合。计算机图像可以被视为人工智能绘画的一部分。下面&#xff0c;我们将按照时间顺序来了解人工智能绘画发展的一些关键时间节点…

26-LINUX--I/O复用-select

一.I/O复用概述 /O复用使得多个程序能够同时监听多个文件描述符&#xff0c;对提高程序的性能有很大帮助。以下情况适用于I/O复用技术&#xff1a; ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接…

如何使用SeaFile文件共享服务器结合内网穿透将家中电脑变成个人云盘

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 本文主要为大家介绍&#xff0c;如何使用两个…

冯喜运:6.7今日外汇黄金原油走势分析及日内操作策略

【黄金消息面分析】&#xff1a;美国初请失业金人数超预期&#xff0c;市场对美联储9月降息预期升温&#xff0c;全球降息潮起&#xff0c;黄金市场受支撑。北京时间本周四&#xff0c;美国劳工部公布的数据显示&#xff0c;截至6月1日当周初请失业金人数增加至22.9万人&#x…

StableDiffusion Windows本地部署

检查电脑环境 启动CMD命令窗。 如上图&#xff0c;在CMD窗口输入python命令&#xff0c;可查看本地安装的python版本信息等。输入exit()退出python命令行 执行where命令&#xff0c;可查看python安装目录。 必须安装Python3.10.x&#xff0c;因为stable-diffusion-webui的一…

卫星通信频段有哪些

卫星通信使用到的频段涵盖L, S, C, Ku, Ka等&#xff0c;而最常用的频段是C(4~8GHz)和Ku(12~18GHz)频段&#xff0c;而Ka(27-40GHz)频段是后起之秀。目前地球赤道上空有限的地球同步卫星轨位几乎已被各国占满&#xff0c;C和Ku频段内的频率资源被大量使用&#xff0c;而Ka频段的…

Java学习中,如何理解注解的概念及常用注解的使用方法

一、简介 Java注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;提供了一种将数据与程序元素&#xff08;类、方法、字段等&#xff09;关联的方法。注解本身不改变程序的执行逻辑&#xff0c;但可以通过工具或框架进行处理&#xff0c;从而影响编译、运行时的…

新品发布 | 飞凌嵌入式RK3576核心板,为AIoT应用赋能

为了充分满足AIoT市场对高性能、高算力和低功耗主控日益增长的需求&#xff0c;飞凌嵌入式全新推出基于Rockchip RK3576处理器开发设计的FET3576-C核心板&#xff01; 集成4个ARM Cortex-A72和4个ARM Cortex-A53高性能核&#xff0c;内置6TOPS超强算力NPU&#xff0c;为您的AI…

ComfyUI 完全入门:必备插件

ComfyUI 是一个基于 Stable Diffusion 的AI绘画创作工具&#xff0c;最近发展势头特别迅猛&#xff0c;但是 ComfyUI 的上手门槛有点高&#xff0c;用户需要对 Stable Diffusion 以及各种数字技术的原理有一定的了解才行。这个系列将会介绍 ComfyUI 的一些基础概念和使用方法&a…

1+x(Java)中级题库易混淆理论题(三)

SQL 语句中进行 group by 分组时&#xff0c;可以不写 where 子句 分组时可以多层分组&#xff0c;比如&#xff1a;先按照省、再按照市来分组。 File 类不能获取文件的内容 在使用 select 语句进行查询分组时&#xff0c;如果希望去掉不满足条件的分组&#xff0c;使用 hav…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…

Laravel框架进阶:掌握队列系统,优化应用性能

Laravel使用队列处理 本文主要讲述如何利用 Laravel 框架的队列系统来管理异步任务和设置周期性执行的任务&#xff0c;从而增强应用程序的效能和可靠性。 Laravel队列的优势 异步执行&#xff1a;将任务添加到队列中后&#xff0c;可以立即返回响应给用户&#xff0c;而任务…

1000Base-T协议解读

一、说明 千兆以太网家族包括1000Base-SX(短距)、1000Base-LX(长距)、1000Base-CX(铜缆短距)、1000Base-T1(车载以太网)和1000Base-T等多种标准,我们这边主要了解下1000Base-T,也就是工业千兆以太网,PC电脑的网口都是这个。 1000Base-T采用了4D-PAM5编码技术(4D代…