《QT5.9 c++ 开发指南》第6章 MDI窗口应用程序设计

先上启动程序的图,功能图没有展现出来,可下源码,去运行,慢慢体会:

建立主页面:

对应的槽函数部分:

第二个页面是:

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()); //显示主窗口的文件名
    }
}
发布了26 篇原创文章 · 获赞 7 · 访问量 4307

猜你喜欢

转载自blog.csdn.net/weixin_42126427/article/details/104332576