先上启动程序的图,功能图没有展现出来,可下源码,去运行,慢慢体会:
建立主页面:
对应的槽函数部分:
第二个页面是:
qformdoc.h
#ifndef QFORMDOC_H
#define QFORMDOC_H
#include <QWidget>
namespace Ui {
class QFormDoc;
}
class QFormDoc : public QWidget
{
Q_OBJECT
private:
QString mCurrentFile; //当前的文件
bool mFileOpened = false;//文件已经打开
public:
explicit QFormDoc(QWidget *parent = nullptr);
~QFormDoc();
void loadFromFile(QString& aFileName); //打开文件
QString currentFileName();//返回当前文件名
bool isFileOpened();//文件已经打开
void setEditFont();//设置字体
void textCut(); //cut
void textCopy(); //copy
void textPaste(); //paste
private:
Ui::QFormDoc *ui;
};
#endif // QFORMDOC_H
qformdoc.cpp
#include "qformdoc.h"
#include "ui_qformdoc.h"
#include <QVBoxLayout>
#include <QFile>
#include <QTextStream>
#include <QFontDialog>
#include <QFileInfo>
#include <QMessageBox>
QFormDoc::QFormDoc(QWidget *parent) :
QWidget(parent),
ui(new Ui::QFormDoc)
{
ui->setupUi(this);
this->setWindowTitle("New Doc");//窗口标题
this->setAttribute(Qt::WA_DeleteOnClose);//关闭时自动删除
}
QFormDoc::~QFormDoc()
{
// QMessageBox::information(this,tr("信息"),tr("文档窗口被释放"));
delete ui;
}
void QFormDoc::loadFromFile(QString &aFileName)
{
QFile aFile(aFileName);
if(aFile.open(QIODevice::ReadOnly|QIODevice::Text))//以只读文本方式打开文件
{
QTextStream aStream(&aFile); //用文本流读取文件
ui->plainTextEdit->clear(); //清空
ui->plainTextEdit->setPlainText(aStream.readAll());
//读取行的方法
// while (!aStream.atEnd())
// {
// str=aStream.readLine();//读取文件的一行
// ui->plainTextEdit->appendPlainText(str); //添加到文本框显示
// }
aFile.close();//关闭文件
mCurrentFile = aFileName;//保存当前文件名
QFileInfo fileInfo(aFileName); //文件信息
QString str=fileInfo.fileName(); //去除路径后的文件名
this->setWindowTitle(str);
mFileOpened=true;
}
}
QString QFormDoc::currentFileName()
{
return mCurrentFile;
}
bool QFormDoc::isFileOpened()
{
return mFileOpened;
}
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();
}
主界面代码如下:
qwmainwindow.h
#ifndef QWMAINWINDOW_H
#define QWMAINWINDOW_H
#include <QMainWindow>
#include "qformdoc.h"
#include <QMdiSubWindow>
namespace Ui {
class QWMainWindow;
}
class QWMainWindow : public QMainWindow
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *event); //主窗口关闭时关闭所有子窗口
public:
explicit QWMainWindow(QWidget *parent = nullptr);
~QWMainWindow();
private slots:
void on_actDoc_New_triggered();
void on_actDoc_Open_triggered();
void on_actFont_triggered();
void on_actCut_triggered();
void on_actCopy_triggered();
void on_actPaste_triggered();
void on_actCascade_triggered();
void on_actTile_triggered();
void on_actCloseALL_triggered();
void on_actViewMode_triggered(bool checked);
void on_mdiArea_subWindowActivated(QMdiSubWindow *arg1);
private:
Ui::QWMainWindow *ui;
};
#endif // QWMAINWINDOW_H
qwmainwindow.cpp
#include "qwmainwindow.h"
#include "ui_qwmainwindow.h"
#include <QPainter>
#include <QFileDialog>
#include <QCloseEvent>
void QWMainWindow::closeEvent(QCloseEvent *event)
{
ui->mdiArea->closeAllSubWindows(); //关闭所有子窗口
event->accept();
}
QWMainWindow::QWMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QWMainWindow)
{
ui->setupUi(this);
this->setCentralWidget(ui->mdiArea);//
this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); //工具栏下
}
QWMainWindow::~QWMainWindow()
{
delete ui;
}
void QWMainWindow::on_actDoc_New_triggered()
{
//新建文档
QFormDoc * formDoc = new QFormDoc(this); //主界面是父窗口
ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI
formDoc->show();
//把灰车按钮变亮
ui->actCut->setEnabled(true);
ui->actCopy->setEnabled(true);
ui->actPaste->setEnabled(true);
ui->actFont->setEnabled(true);
}
void QWMainWindow::on_actDoc_Open_triggered()
{
//打开文件
//必须先获取当前MDI子窗口,再使用打开文件对话框,否则无法获得活动的子窗口
bool needNew = false; // 是否需要新建子窗口
QFormDoc * formDoc;
if(ui->mdiArea->subWindowList().count() > 0) //存在界面
{
formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
needNew=formDoc->isFileOpened();//文件已经打开,需要新建窗口 (未加载文件为false)
}
else {
needNew = true;
}
QString curPath = QDir::currentPath(); //当前工程的路径
QString aFileName = QFileDialog::getOpenFileName(this,tr("打开一个文件"),
curPath,
"C程序文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)");
if(aFileName.isEmpty())
return;
if(needNew) //需要新建子窗口
{
formDoc = new QFormDoc(this);//指定父窗口,必须在父窗口为Widget窗口提供一个显示区域
ui->mdiArea->addSubWindow(formDoc);
}
formDoc->loadFromFile(aFileName);
formDoc->show();
//把灰车按钮变亮
ui->actCut->setEnabled(true);
ui->actCopy->setEnabled(true);
ui->actPaste->setEnabled(true);
ui->actFont->setEnabled(true);
}
void QWMainWindow::on_actFont_triggered()
{
QFormDoc *formDoc = ( QFormDoc *)ui->mdiArea->activeSubWindow()->widget();
formDoc->setEditFont();
}
void QWMainWindow::on_actCut_triggered()
{
//cut
QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
formDoc->textCut();
}
void QWMainWindow::on_actCopy_triggered()
{
//copy
QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
formDoc->textCopy();
}
void QWMainWindow::on_actPaste_triggered()
{
//paste
QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
formDoc->textPaste();
}
void QWMainWindow::on_actCascade_triggered()
{
//窗口级联展开
ui->mdiArea->cascadeSubWindows();
}
void QWMainWindow::on_actTile_triggered()
{
//平铺展开
ui->mdiArea->tileSubWindows();
}
void QWMainWindow::on_actCloseALL_triggered()
{
//关闭全部子窗口
ui->mdiArea->closeAllSubWindows();
}
void QWMainWindow::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 QWMainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{
Q_UNUSED(arg1)
if(ui->mdiArea->subWindowList().count()==0)
{
//若子窗口个数为零
ui->actCut->setEnabled(false);
ui->actCopy->setEnabled(false);
ui->actPaste->setEnabled(false);
ui->actFont->setEnabled(false);
ui->statusBar->clearMessage();
}
else
{
QFormDoc *formDoc = static_cast<QFormDoc *>(
ui->mdiArea->activeSubWindow()->widget());
ui->statusBar->showMessage(formDoc->currentFileName()); //显示主窗口的文件名
}
}