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 ...
随机推荐
- 为什么你用的 MyBatis 慢?一行配置让它性能翻倍!
为什么你用的 MyBatis 慢?一行配置让它性能翻倍! 在 Java 后端开发的江湖里,MyBatis 堪称一员大将,凭借着灵活的 SQL 编写.方便的数据库对接能力,深受广大开发者的喜爱.但不少小 ...
- 《前端运维》五、k8s--2pod、services与Ingress部署
前一篇啊,我们学完了基本的配置.这一篇,我们来看下服务部署的配置.我们先来看张图,理解下k8s的应用场景和调用流程: 看上图,首先,master是控制节点,负责编排.管理.调度用户提交的作业.kube ...
- Electron包下载经常失败或太慢问题
前情 Electron是很好的桌面端开发框架,公司有个桌面端项目就是基于Electron开发的. 坑 在项目初始化的时候,需要通过npm install安装项目需要依赖的模块,但是经常报Electro ...
- 【Amadeus原创】docker安装TOMCAT,并运行本地代码
1,docker 下载tomcat [root@it-1c2d ~]# docker pull tomcat ... [root@it-1c2d ~]# docker images REPOSITOR ...
- 如何使用对象存储 COS ?七个步骤,帮你搞定!
导语:本文将介绍新手如何使用对象存储 COS,主要面向小白用户,旨在快速带领用户了解 COS 的优势.功能.费用.接口及控制台指南. 01 什么是对象存储 腾讯云对象存储 COS(Cloud Obje ...
- [AGC029D] Grid game题解
这题很显然可以用贪心来解. 由于先手不动一定会让局数更少,所以先手要能动就动. 而后手一定是希望他的石子可以撞到一个障碍物上,这样先手就无法移动了,后手就可以让局数更少. 因为先手一定会能动就动,所以 ...
- NATS: 请求-响应消息
请求-回复消息 https://docs.nats.io/nats-concepts/core-nats/reqreply 请求-回复 在分布式系统中,请求-回复是一种常见的模式.发送请求之后,应用程 ...
- JSchException: Algorithm negotiation fail问题解决之路
最近一个需求用到了SFTP上传功能,同事之前已经封装好了SFTP工具类,用的是JSch,本着不要重复造轮子的想法,就直接拿来用了.交代下环境,JDK为1.7,JSch版本为0.1.51.自测通过.测试 ...
- 安装opencv_contrib-3.4.9, fatal error: opencv2/xfeatures2d.hpp: 没有那个文件或目录. 解决方法
1. 在Opencv的CmakeLists.txt 中加入以下include语句: INCLUDE_DIRECTORIES("/home/yourusername/Dependencies/ ...
- 命名空间“System.Web.UI.Design”中不存在类型或命名空间名称“ControlDesigner”
命名空间"System.Web.UI.Design"中不存在类型或命名空间名称"ControlDesigner" 命名空间"System.Web.UI ...