QT5笔记:27. MDI应用程序设计
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应用程序设计的更多相关文章
- JAVA自学笔记27
JAVA自学笔记27 1.类的加载 1)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. ①加载:就是指将class文件读入内存,并为之创 ...
- 《Effective Java》笔记45-56:通用程序设计
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的 ...
- 读书笔记《PHP高级程序设计、模式、框架与测试》
序言 闲来无事,下载了一些电子书,然后看书名不错<PHP高级程序设计_模式.框架与测试>,翻了一下虽然书有点老了但是讲的内容经常会碰到!给大家推荐一下,然后这里放上我的读书笔记,每日更新. ...
- [原创]java WEB学习笔记27:深入理解面向接口编程
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 【学习笔记】PYTHON语言程序设计(北理工 嵩天)
1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则 摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...
- 精读《javascript高级程序设计》笔记三——面向对象的程序设计
重点来了,我认为这一章值得好好地反复地看.看第一遍 还是懵懵懂懂,现在看第二遍,终于能看出点意思了. 创建对象 工厂模式 function createPerson(name, age, job){ ...
- 听翁恺老师mooc笔记(16)--程序设计与C语言
问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...
- 《JavaScript高级程序设计》笔记:面向对象的程序设计(六)
面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象. 理解对象 创建自定义对象的最简单的方法就是创建一个Object的实例,然后再为它添加属性和方法.例 ...
- C++学习笔记53:泛型程序设计与C++标准模板库
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...
- 读书笔记(javascript 高级程序设计)
一. 数据类型: 1. undefined: 未声明和未初始化的变量,typeof 操作符返回的结果都是 undefined:(建议未初始化的变量进行显式赋值,这样当 typeof 返回 undefi ...
随机推荐
- N皇后问题(DFS-深度优先算法)
N皇后问题(DFS-深度优先算法) 题目描述: 在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 22 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 的斜线上. ...
- 一比一还原axios源码(七)—— 取消功能
按照惯例,我们先来看下官方的例子: 你可以通过axios的CancelToken工厂函数,生成一个source,然后把这个对象作为参数传递给axios,最后,需要取消的时候调用source的cance ...
- 人工智能大语言模型起源篇(二),从通用语言微调到驾驭LLM
上一篇:<人工智能大语言模型起源篇(一),从哪里开始> (5)Howard 和 Ruder 于2018年发表的<Universal Language Model Fine-tunin ...
- 树莓派获取唯一ID
树莓派的CPU有序列号,可以通过读取 /proc/cpuinfo 获取 储存的UUID,可以通过 ls /dev/disk/by-uuid或blkid
- 【分块】LibreOJ 6280 数列分块入门4
题目 https://loj.ac/p/6280 题解 将 \(n\) 个元素的数组 \(a\) 按块长 \(\sqrt{n}\) 进行分块处理.为每个块设置两个懒添加标记 \(add[i], sum ...
- WebP图片使用踩坑
前情 WebP是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,最初在2010年发布,目标是减少文件大小,相较于传统的 PNG.JPG,甚至是动图 GIF 的格式,WebP 比它们的空间更 ...
- 手撕vector
Myclass.h #pragma once #include<iostream> #include<Windows.h> #define SUCCESS 1 // 成功 #d ...
- PDF 图书
我找到的深入介绍 PDF 结构的图书主要有 2 本: PDF Explained,这本书比较早,首发于 2011 年11 月 30 日 Developing with PDF,首发于 2013年10月 ...
- AOP中动态代理详解
动态代理概述 什么是代理 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问 什么是动态代理? 动态代理就是,在程序运行期,创建目标对象的代理对象,并对目 ...
- 【Linux】Deepin安装Anaconda后手动配置环境变量
配置环境变量 如果安装完毕后,重新打开终端,输入conda表示没找到这个命令 说明没有配置环境变量 那么我们首先第一件事,就是找到我们的conda安装到哪里了 例如我的是安装到主目录的(默认在这的,安 ...
