Qt:77---Demo(MDI多文档界面案例)
- 本案例的基础知识来自于文章: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多文档界面案例)相关推荐
- Qt实现Word文档界面样式--QtitanRibbon
QtitanRibbon - Microsoft Ribbon for Nokia's Qt概念的实现 QtitanRibbon组件实现了Microsoft Ribbon for Qt的概念,设计用于 ...
- Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)
一个典型的GUI应用程序可能有多个窗口,选项卡控件和堆栈窗口控件允许一次使用其中的一个窗口.然而,很多时候这种方法不是很有用,因为其他窗口的视图是隐藏的一种同时显示多个窗口的方法是,创建多个独立的窗口 ...
- MDI窗体(多文档界面)
多文档界面(Multiple-Document Interface),简称MDI窗体.MDI窗体用于同时显示多个文档,每个文档显示在各自的窗口中.MDI窗体中通常有包含子菜单的窗口菜单,用于在窗口或文 ...
- wxWidgets:多文档界面实例
wxWidgets:多文档界面实例 wxWidgets:多文档界面实例 mdi.h完整源代码 mdi.cpp完整源代码 wxWidgets:多文档界面实例 mdi.h完整源代码 #include &q ...
- linux 基于qt assistant制作软件帮助文档,基于Qt Assistant的软件帮助系统
Qt Assistant是Qt自带的一款可定制.可重新发行的帮助文件浏览器.Qt Assistant支持HTML文件,用户可以利用其定制自己的功能强大的帮助文档浏览器.关于Qt Assistant定制 ...
- 1-4 多文档界面处理(2)
1-4-3 多文档界面的窗体传值技术 1.简介 一般在一个Windows开发项目系统之中,多文档窗口(MDI)只有一个,而其余的窗口为非MDI窗口,在设定窗口的父子关系时候,需要指定这些非MDI窗口的 ...
- 【Qt】DOM读取XML文档
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. XML文档示例 04. DOM读取XML文档内容 05. 预留 06. 附录 01. 概述 DOM(Document Ob ...
- Qt使用html生成word文档
Qt使用html生成word文档 零.前言 一.效果图 二.核心代码 零.前言 项目中要用到把一些图片和一些报告保存为word文件,今天研究了一下,主要是使用html方法保存为word文档,这对htm ...
- 实施文档_Word 2010文档处理案例教程
Word 2010文档处理案例教程 ISBN:978-7-80243-928-3/02 作者:黄桂林 江义火 郭燕 定价:38.00元 出版社:航空工业出版社 适用层次:通用 出版日期:2019-10 ...
最新文章
- Applese 填数字
- OpenCV与FLANN的功能匹配
- hdu 2025 查找最大元素
- 关于正则表达式,我所知道的都在这里
- 关于字符的读入与输出
- 百度的html代码是什么,百度网页源代码是什么?
- 飞鸽传书内部护眼神功
- c语言 获取可用内存大小,C语言实现获取内存信息并输出的实例
- ros简版Action通讯SimpleAction
- 编辑距离问题(Edit Distance Problem)
- 电子/硬件工程师手册
- css模糊遮罩效果_CSS 半透明遮罩层
- 最新Oreo支付系统平台完整源码+已全开源
- 【软件安装】IDM安装并扩展到FireFox和Google Chrome
- al换脸一键生成_使用al生成详细的课程计划
- 32位联想台式机更新xp到win10工作站版本
- 播布客LINUX视频笔记
- python 录音左右声道_Python分离立体声wav压缩文件的左右声道
- mysql数据库误删后能恢复吗_MySQL 数据库误删除后的数据恢复
- nltk学习之统计词频和分词nltk.word_tokenize nltk.FreqDist
热门文章
- 电脑壁纸2K+Win10实用快捷键
- 微星主板cpu故障灯一直亮红灯解决办法
- openid无效什么意思_发送微信模板消息,返回OpenId无效
- EIZO船舶触摸屏维修T1502-B
- Windows Server 2008 Standard Enterprise Datacenter各个版本区别
- 布局与控件(一)——布局与控件的常用概念
- 【日志问题】JDK Logging、Commons Logging和Log4j、Slf4j和Logbacck的介绍和简单使用
- ERROR: Failed to set up Chromium r901912! Set “PUPPETEER_SKIP_DOWNLOAD“ env variable to skip downloa
- 笔记本自动重启原因总结
- css入门教程资料(3)