MDI:Multiple Document Interface 多窗口文档界面

例子:

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include <QMdiSubWindow> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); private slots:
void on_actDoc_New_triggered(); void on_actDoc_Open_triggered(); void on_actFont_triggered(); void on_actCopy_triggered(); void on_actPaste_triggered(); void on_actCut_triggered(); void on_actViewMode_triggered(bool checked); void on_actCascade_triggered(); void on_actTile_triggered(); void on_mdiArea_subWindowActivated(QMdiSubWindow *arg1); void on_actCloseALL_triggered(); private:
Ui::MainWindow *ui;
}; #endif // MAINWINDOW_H

MainWindow.cpp

#include "form.h"
#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QFileDialog> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_actDoc_New_triggered()//新建窗口
{
Form *form = new Form(this);
ui->mdiArea->addSubWindow(form);
form->show(); ui->actFont->setEnabled(true);
ui->actCopy->setEnabled(true);
ui->actPaste->setEnabled(true);
ui->actCut->setEnabled(true);
} void MainWindow::on_actDoc_Open_triggered()//文档打开
{
bool isNew = false;//false表示可以使用当前form,否则需要new一个窗口
Form *form;
if (ui->mdiArea->subWindowList().size() > 0) {
form = (Form *)ui->mdiArea->activeSubWindow()->widget();
isNew = form->isUsed();
} else {
isNew = !isNew;
}
QString curPath = QDir::currentPath();
QString fileName = QFileDialog::getOpenFileName(this, "文本文件", curPath, "源文件(*.h *.cpp);;所有文件(*.*)");
if (!fileName.isEmpty()) {
if (isNew) {
form = new Form(this);
ui->mdiArea->addSubWindow(form);
}
form->loadFileContent(fileName);
form->show(); ui->actFont->setEnabled(true);
ui->actCopy->setEnabled(true);
ui->actPaste->setEnabled(true);
ui->actCut->setEnabled(true);
}
} void MainWindow::on_actFont_triggered()//字体设置
{
Form *form = (Form *)ui->mdiArea->activeSubWindow()->widget();
form->setFont();
} void MainWindow::on_actCopy_triggered()//复制
{
Form *form = (Form *)ui->mdiArea->activeSubWindow()->widget();
form->copyText();
} void MainWindow::on_actPaste_triggered()//粘贴
{
Form *form = (Form *)ui->mdiArea->activeSubWindow()->widget();
form->pasteText();
} void MainWindow::on_actCut_triggered()//剪切
{
Form *form = (Form *)ui->mdiArea->activeSubWindow()->widget();
form->cutText();
} void MainWindow::on_actViewMode_triggered(bool checked)//设置MDI模式
{
if (checked) {
ui->mdiArea->setViewMode(QMdiArea::TabbedView);//在tab模式下,没有堆叠或者平铺这种模式
ui->mdiArea->setTabsClosable(true);
ui->actTile->setEnabled(false);
ui->actCascade->setEnabled(false);
} else {
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
ui->actTile->setEnabled(true);
ui->actCascade->setEnabled(true);
}
} void MainWindow::on_actCascade_triggered()//级联展开
{
ui->mdiArea->cascadeSubWindows();
} void MainWindow::on_actTile_triggered()//平铺展开
{
ui->mdiArea->tileSubWindows();
} void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)//状态栏显示当前文档URL
{
if (ui->mdiArea->subWindowList().size() == 0) {
ui->actFont->setEnabled(false);
ui->actCopy->setEnabled(false);
ui->actPaste->setEnabled(false);
ui->actCut->setEnabled(false);
} else {
Form *form = (Form *)arg1->widget();
ui->statusbar->showMessage(form->curFile());
}
} void MainWindow::on_actCloseALL_triggered()//关闭所有
{
QList<QMdiSubWindow *> listSubWin = ui->mdiArea->subWindowList();
QMutableListIterator<QMdiSubWindow *> iterator(listSubWin);
while (iterator.hasNext()) {
QMdiSubWindow *window = iterator.next();
window->close();
}
}

Form.h

#ifndef FORM_H
#define FORM_H #include <QWidget> namespace Ui {
class Form;
} class Form : public QWidget
{
Q_OBJECT public:
explicit Form(QWidget *parent = nullptr);
~Form(); bool isUsed(); void loadFileContent(QString fileName); QString curFile(); void setFont(); void copyText(); void pasteText(); void cutText();
private:
Ui::Form *ui;
bool isUsing = false;
QString curFileName;
}; #endif // FORM_H

Form.cpp

#include "form.h"
#include "ui_form.h" #include <QFile>
#include <QFileInfo>
#include <QFontDialog>
#include <QTextStream> Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
} Form::~Form()
{
delete ui;
} bool Form::isUsed()
{
return isUsing;
} void Form::loadFileContent(QString fileName)//加载文本
{
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream stream(&file);
QString content = "";
while (!stream.atEnd()) {
content += stream.readLine() + "\n"; }
ui->plainTextEdit->clear();
ui->plainTextEdit->setPlainText(content);
file.close(); curFileName = fileName;
QFileInfo info(fileName);
this->setWindowTitle(info.fileName());
isUsing = true;
}
} QString Form::curFile()
{
return curFileName;
} void Form::setFont()
{
QFont font = ui->plainTextEdit->font();
bool ok = false;
font = QFontDialog::getFont(&ok, font);
ui->plainTextEdit->setFont(font);
} void Form::copyText()
{
ui->plainTextEdit->copy();
} void Form::pasteText()
{
ui->plainTextEdit->paste();
} void Form::cutText()
{
ui->plainTextEdit->cut();
}

界面

QT5笔记:27. MDI应用程序设计的更多相关文章

  1. JAVA自学笔记27

    JAVA自学笔记27 1.类的加载 1)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. ①加载:就是指将class文件读入内存,并为之创 ...

  2. 《Effective Java》笔记45-56:通用程序设计

    将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的 ...

  3. 读书笔记《PHP高级程序设计、模式、框架与测试》

    序言 闲来无事,下载了一些电子书,然后看书名不错<PHP高级程序设计_模式.框架与测试>,翻了一下虽然书有点老了但是讲的内容经常会碰到!给大家推荐一下,然后这里放上我的读书笔记,每日更新. ...

  4. [原创]java WEB学习笔记27:深入理解面向接口编程

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)

    1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则     摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...

  6. 精读《javascript高级程序设计》笔记三——面向对象的程序设计

    重点来了,我认为这一章值得好好地反复地看.看第一遍 还是懵懵懂懂,现在看第二遍,终于能看出点意思了. 创建对象 工厂模式 function createPerson(name, age, job){ ...

  7. 听翁恺老师mooc笔记(16)--程序设计与C语言

    问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...

  8. 《JavaScript高级程序设计》笔记:面向对象的程序设计(六)

    面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象. 理解对象 创建自定义对象的最简单的方法就是创建一个Object的实例,然后再为它添加属性和方法.例 ...

  9. C++学习笔记53:泛型程序设计与C++标准模板库

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...

  10. 读书笔记(javascript 高级程序设计)

    一. 数据类型: 1. undefined: 未声明和未初始化的变量,typeof 操作符返回的结果都是 undefined:(建议未初始化的变量进行显式赋值,这样当 typeof 返回 undefi ...

随机推荐

  1. 为什么你用的 MyBatis 慢?一行配置让它性能翻倍!

    为什么你用的 MyBatis 慢?一行配置让它性能翻倍! 在 Java 后端开发的江湖里,MyBatis 堪称一员大将,凭借着灵活的 SQL 编写.方便的数据库对接能力,深受广大开发者的喜爱.但不少小 ...

  2. 《前端运维》五、k8s--2pod、services与Ingress部署

    前一篇啊,我们学完了基本的配置.这一篇,我们来看下服务部署的配置.我们先来看张图,理解下k8s的应用场景和调用流程: 看上图,首先,master是控制节点,负责编排.管理.调度用户提交的作业.kube ...

  3. Electron包下载经常失败或太慢问题

    前情 Electron是很好的桌面端开发框架,公司有个桌面端项目就是基于Electron开发的. 坑 在项目初始化的时候,需要通过npm install安装项目需要依赖的模块,但是经常报Electro ...

  4. 【Amadeus原创】docker安装TOMCAT,并运行本地代码

    1,docker 下载tomcat [root@it-1c2d ~]# docker pull tomcat ... [root@it-1c2d ~]# docker images REPOSITOR ...

  5. 如何使用对象存储 COS ?七个步骤,帮你搞定!

    导语:本文将介绍新手如何使用对象存储 COS,主要面向小白用户,旨在快速带领用户了解 COS 的优势.功能.费用.接口及控制台指南. 01 什么是对象存储 腾讯云对象存储 COS(Cloud Obje ...

  6. [AGC029D] Grid game题解

    这题很显然可以用贪心来解. 由于先手不动一定会让局数更少,所以先手要能动就动. 而后手一定是希望他的石子可以撞到一个障碍物上,这样先手就无法移动了,后手就可以让局数更少. 因为先手一定会能动就动,所以 ...

  7. NATS: 请求-响应消息

    请求-回复消息 https://docs.nats.io/nats-concepts/core-nats/reqreply 请求-回复 在分布式系统中,请求-回复是一种常见的模式.发送请求之后,应用程 ...

  8. JSchException: Algorithm negotiation fail问题解决之路

    最近一个需求用到了SFTP上传功能,同事之前已经封装好了SFTP工具类,用的是JSch,本着不要重复造轮子的想法,就直接拿来用了.交代下环境,JDK为1.7,JSch版本为0.1.51.自测通过.测试 ...

  9. 安装opencv_contrib-3.4.9, fatal error: opencv2/xfeatures2d.hpp: 没有那个文件或目录. 解决方法

    1. 在Opencv的CmakeLists.txt 中加入以下include语句: INCLUDE_DIRECTORIES("/home/yourusername/Dependencies/ ...

  10. 命名空间“System.Web.UI.Design”中不存在类型或命名空间名称“ControlDesigner”

    命名空间"System.Web.UI.Design"中不存在类型或命名空间名称"ControlDesigner" 命名空间"System.Web.UI ...