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. N皇后问题(DFS-深度优先算法)

    N皇后问题(DFS-深度优先算法) 题目描述: 在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 22 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 的斜线上. ...

  2. 一比一还原axios源码(七)—— 取消功能

    按照惯例,我们先来看下官方的例子: 你可以通过axios的CancelToken工厂函数,生成一个source,然后把这个对象作为参数传递给axios,最后,需要取消的时候调用source的cance ...

  3. 人工智能大语言模型起源篇(二),从通用语言微调到驾驭LLM

    上一篇:<人工智能大语言模型起源篇(一),从哪里开始> (5)Howard 和 Ruder 于2018年发表的<Universal Language Model Fine-tunin ...

  4. 树莓派获取唯一ID

    树莓派的CPU有序列号,可以通过读取 /proc/cpuinfo 获取 储存的UUID,可以通过 ls /dev/disk/by-uuid或blkid

  5. 【分块】LibreOJ 6280 数列分块入门4

    题目 https://loj.ac/p/6280 题解 将 \(n\) 个元素的数组 \(a\) 按块长 \(\sqrt{n}\) 进行分块处理.为每个块设置两个懒添加标记 \(add[i], sum ...

  6. WebP图片使用踩坑

    前情 WebP是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,最初在2010年发布,目标是减少文件大小,相较于传统的 PNG.JPG,甚至是动图 GIF 的格式,WebP 比它们的空间更 ...

  7. 手撕vector

    Myclass.h #pragma once #include<iostream> #include<Windows.h> #define SUCCESS 1 // 成功 #d ...

  8. PDF 图书

    我找到的深入介绍 PDF 结构的图书主要有 2 本: PDF Explained,这本书比较早,首发于 2011 年11 月 30 日 Developing with PDF,首发于 2013年10月 ...

  9. AOP中动态代理详解

    动态代理概述 什么是代理 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问 什么是动态代理? 动态代理就是,在程序运行期,创建目标对象的代理对象,并对目 ...

  10. 【Linux】Deepin安装Anaconda后手动配置环境变量

    配置环境变量 如果安装完毕后,重新打开终端,输入conda表示没找到这个命令 说明没有配置环境变量 那么我们首先第一件事,就是找到我们的conda安装到哪里了 例如我的是安装到主目录的(默认在这的,安 ...