一、文档类窗体的设计
- 这个窗体类是用来放在主窗体的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(); //cut void textCopy(); //copy void 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)) { //读取文件并讲内容放入plainTextEdit QTextStream 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,表示不需要新建子窗口 } else needNew=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()); } }