• 本案例的基础知识来自于文章:https://blog.csdn.net/qq_41453285/article/details/98949333

一、文档类窗体的设计

  • 这个窗体类是用来放在主窗体的MDIArea组件中的

①窗体创建与设计

  • 类中只放置一个QPlainTextEdit组件,并以水平布局填充整个窗口

②类的初始化

class QFormDoc : public QWidget
{Q_OBJECT
private:QString mCurrentFile;   //当前文件名bool mFileOpened=false; //判断当前文件是否已打开,默认为未打开
public:explicit QFormDoc(QWidget *parent = 0);~QFormDoc();void loadFormFile(QString &aFileName); //打开文件,并将文件内容读取plainTextEdit中QString currentFileName();  //返回当前文件名bool isFileOpened();  //判断文件是否已打开void setEditFont();   //设置字体void textCut();       //cutvoid textCopy();      //copyvoid textPaste();     //paste
private:Ui::QFormDoc *ui;
};

③相关函数的定义

//构造函数
QFormDoc::QFormDoc(QWidget *parent) :QWidget(parent),ui(new Ui::QFormDoc)
{ui->setupUi(this);this->setWindowTitle("New Doc");         //窗口标题 this->setAttribute(Qt::WA_DeleteOnClose);//关闭时自动删除(备注:不论是否设置此项,MDI在关闭时,都会删除窗口对象)
}
//析构函数
QFormDoc::~QFormDoc()
{QMessageBox::information(this,QStringLiteral("信息"),QStringLiteral("文档窗口被释放"));//窗口关闭之后提示delete ui;
}
//打开文件,并将文件内容读取plainTextEdit中
void QFormDoc::loadFormFile(QString &aFileName)
{QFile aFile(aFileName);if(aFile.open(QIODevice::ReadOnly|QIODevice::Text)){//读取文件并讲内容放入plainTextEditQTextStream aStream(&aFile);ui->plainTextEdit->clear();ui->plainTextEdit->setPlainText(aStream.readAll());aFile.close();//根据文件名获取文件信息,将文件名设置MDI窗体的标题mCurrentFile=aFileName;QFileInfo fileInfo(aFileName);QString str=fileInfo.fileName();this->setWindowTitle(str);mFileOpened=true;}
}
//返回当前文件名称
QString QFormDoc::currentFileName()
{return mCurrentFile;
}
//判断当前文件是否打开,打开返回true
bool QFormDoc::isFileOpened()
{return mFileOpened;
}
//设置plainTextEdit的梯子
void QFormDoc::setEditFont()
{QFont font=ui->plainTextEdit->font();bool ok;font=QFontDialog::getFont(&ok,font); //打开字体设置窗体ui->plainTextEdit->setFont(font);
}
//对文档的剪切、复制、黏贴
void QFormDoc::textCut()
{ui->plainTextEdit->cut();
}void QFormDoc::textCopy()
{ui->plainTextEdit->copy();
}void QFormDoc::textPaste()
{ui->plainTextEdit->paste();
}

二、主窗体设计

①主窗体界面设计

  • 主窗体中是一个MDI Area组件

  • 因为要在主窗口调用刚才自己设计的MDI窗体类QFormDoc,所以加入下面的头文件

②Action设计

  • 添加了以下的Action,作为主窗体的工具栏使用

③构造函数

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->setCentralWidget(ui->mdiArea); //让MDI Area组件填充满主窗口区域this->setWindowState(Qt::WindowMaximized); //设置窗体最大化//让工具按钮的文字处于图标的下方ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
}

④新建文档按钮的触发函数

  • 点击此按钮,在MDIArea中创建一个新的窗体
void MainWindow::on_actDoc_New_triggered()
{QFormDoc *formDoc=new QFormDoc(this); //创建文档窗口对象ui->mdiArea->addSubWindow(formDoc); //将文档窗口添加到MDI中formDoc->show(); //显示MDI窗体
}

⑤打开文档按钮的触发函数

  • 点击此按钮,选择一个文档,并将文档的内容显示到MDIArea的窗体中
void MainWindow::on_actDoc_Open_triggered()
{bool needNew=false; //是否需要新建子窗口QFormDoc *formDoc;if(ui->mdiArea->subWindowList().count()>0) //如有mdiArea组件中已经有窗口{formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();//获取当前鼠标所选中的窗口对象needNew=formDoc->isFileOpened(); //needNew为false,表示不需要新建子窗口}elseneedNew=true; //mdiArea组件中还没有窗口,需要新建//打开一个文件QString curPath=QDir::currentPath();QString aFileName=QFileDialog::getOpenFileName(this,QStringLiteral("打开一个文件"),curPath,QStringLiteral("C程序文件(*.h *.cpp);;所有文件(*.*)"));if(aFileName.isEmpty())return;if(needNew) //如果需要新建窗口,那么新建窗口{formDoc=new QFormDoc(this);ui->mdiArea->addSubWindow(formDoc); //将新建的窗口变为当前的操作窗口}formDoc->loadFormFile(aFileName); //通过文件名加载文件内容formDoc->show(); //显示窗口ui->actCut->setEnabled(true);ui->actCopy->setEnabled(true);ui->actPaste->setEnabled(true);ui->actFont->setEnabled(true);
}

⑥关闭全部按钮的触发函数

  • 点击此按钮,关闭MDI中所有窗体
void MainWindow::on_actCloseAll_triggered()
{ui->mdiArea->closeAllSubWindows();//关闭全部子窗口
}

⑦MDI模式按钮的触发函数

void MainWindow::on_actViewMode_triggered(bool checked)
{if(checked){ui->mdiArea->setViewMode(QMdiArea::TabbedView);//Tab多页显示模式ui->mdiArea->setTabsClosable(true); //页面可关闭//窗体不能够设置级联展开和平铺展开ui->actCascade->setEnabled(false);ui->actTile->setEnabled(false);}else{ui->mdiArea->setViewMode(QMdiArea::SubWindowView); //子窗口模式//窗体可以设置级联展开和平铺展开ui->actCascade->setEnabled(true);ui->actTile->setEnabled(true);}
}

⑧级联展开、平铺展开按钮触发函数

//窗体级联显示
void MainWindow::on_actCascade_triggered()
{ui->mdiArea->cascadeSubWindows();
}//窗体平铺显示
void MainWindow::on_actTile_triggered()
{ui->mdiArea->tileSubWindows();
}

级联展开

平铺展开

⑨其他按钮触发函数

void MainWindow::on_actCut_triggered()
{//获取当前的活动窗口QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->textCut();//剪切
}void MainWindow::on_actFont_triggered()
{QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();formDoc->setEditFont();
}

⑩MDI的subWindowActivated信号函数

  • 当前活动窗口切换时产生触发此信号函数,利用该信号函数可以在活动窗口切换时进行一些处理
void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{if(ui->mdiArea->subWindowList().count()==0)//如果当前MDI中没有窗口了{//编辑按钮都不能使用ui->actCut->setEnabled(false);ui->actCopy->setEnabled(false);ui->actPaste->setEnabled(false);ui->actFont->setEnabled(false);ui->statusBar->clearMessage();}else{//当窗口切换时,将当前活动的窗口打开的文件名显示到statusBar中QFormDoc *formDoc=static_cast<QFormDoc*>(ui->mdiArea->activeSubWindow()->widget());ui->statusBar->showMessage(formDoc->currentFileName());}
}

Qt:77---Demo(MDI多文档界面案例)相关推荐

  1. Qt实现Word文档界面样式--QtitanRibbon

    QtitanRibbon - Microsoft Ribbon for Nokia's Qt概念的实现 QtitanRibbon组件实现了Microsoft Ribbon for Qt的概念,设计用于 ...

  2. Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)

    一个典型的GUI应用程序可能有多个窗口,选项卡控件和堆栈窗口控件允许一次使用其中的一个窗口.然而,很多时候这种方法不是很有用,因为其他窗口的视图是隐藏的一种同时显示多个窗口的方法是,创建多个独立的窗口 ...

  3. MDI窗体(多文档界面)

    多文档界面(Multiple-Document Interface),简称MDI窗体.MDI窗体用于同时显示多个文档,每个文档显示在各自的窗口中.MDI窗体中通常有包含子菜单的窗口菜单,用于在窗口或文 ...

  4. wxWidgets:多文档界面实例

    wxWidgets:多文档界面实例 wxWidgets:多文档界面实例 mdi.h完整源代码 mdi.cpp完整源代码 wxWidgets:多文档界面实例 mdi.h完整源代码 #include &q ...

  5. linux 基于qt assistant制作软件帮助文档,基于Qt Assistant的软件帮助系统

    Qt Assistant是Qt自带的一款可定制.可重新发行的帮助文件浏览器.Qt Assistant支持HTML文件,用户可以利用其定制自己的功能强大的帮助文档浏览器.关于Qt Assistant定制 ...

  6. 1-4 多文档界面处理(2)

    1-4-3 多文档界面的窗体传值技术 1.简介 一般在一个Windows开发项目系统之中,多文档窗口(MDI)只有一个,而其余的窗口为非MDI窗口,在设定窗口的父子关系时候,需要指定这些非MDI窗口的 ...

  7. 【Qt】DOM读取XML文档

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. XML文档示例 04. DOM读取XML文档内容 05. 预留 06. 附录 01. 概述 DOM(Document Ob ...

  8. Qt使用html生成word文档

    Qt使用html生成word文档 零.前言 一.效果图 二.核心代码 零.前言 项目中要用到把一些图片和一些报告保存为word文件,今天研究了一下,主要是使用html方法保存为word文档,这对htm ...

  9. 实施文档_Word 2010文档处理案例教程

    Word 2010文档处理案例教程 ISBN:978-7-80243-928-3/02 作者:黄桂林 江义火 郭燕 定价:38.00元 出版社:航空工业出版社 适用层次:通用 出版日期:2019-10 ...

最新文章

  1. Applese 填数字
  2. OpenCV与FLANN的功能匹配
  3. hdu 2025 查找最大元素
  4. 关于正则表达式,我所知道的都在这里
  5. 关于字符的读入与输出
  6. 百度的html代码是什么,百度网页源代码是什么?
  7. 飞鸽传书内部护眼神功
  8. c语言 获取可用内存大小,C语言实现获取内存信息并输出的实例
  9. ros简版Action通讯SimpleAction
  10. 编辑距离问题(Edit Distance Problem)
  11. 电子/硬件工程师手册
  12. css模糊遮罩效果_CSS 半透明遮罩层
  13. 最新Oreo支付系统平台完整源码+已全开源
  14. 【软件安装】IDM安装并扩展到FireFox和Google Chrome
  15. al换脸一键生成_使用al生成详细的课程计划
  16. 32位联想台式机更新xp到win10工作站版本
  17. 播布客LINUX视频笔记
  18. python 录音左右声道_Python分离立体声wav压缩文件的左右声道
  19. mysql数据库误删后能恢复吗_MySQL 数据库误删除后的数据恢复
  20. nltk学习之统计词频和分词nltk.word_tokenize nltk.FreqDist

热门文章

  1. 电脑壁纸2K+Win10实用快捷键
  2. 微星主板cpu故障灯一直亮红灯解决办法
  3. openid无效什么意思_发送微信模板消息,返回OpenId无效
  4. EIZO船舶触摸屏维修T1502-B
  5. Windows Server 2008 Standard Enterprise Datacenter各个版本区别
  6. 布局与控件(一)——布局与控件的常用概念
  7. 【日志问题】JDK Logging、Commons Logging和Log4j、Slf4j和Logbacck的介绍和简单使用
  8. ERROR: Failed to set up Chromium r901912! Set “PUPPETEER_SKIP_DOWNLOAD“ env variable to skip downloa
  9. 笔记本自动重启原因总结
  10. css入门教程资料(3)