Qt应用之MDI(多文档设计)

qt creator 版本6.8.0 MinGW 64bit

由此模块可以扩展成设计一个qt文本编辑器。

界面如下

部分功能展示如下

新建文件

打开文件

mdi模式、级联模式和平铺模式

界面和程序构建过程。

1.如图所需.cpp和.h文件

2.mainwindow.ui和tformdoc.ui界面布局如下

不懂什么是Action如何建立和使用的请看我的另一篇文章。

tformdoc.h和tformdoc.cpp代码如下

cpp 复制代码
#ifndef TFORMDOC_H
#define TFORMDOC_H

#include <QWidget>

namespace Ui {
class TFormDoc;
}

class TFormDoc : public QWidget
{
    Q_OBJECT

public:
    explicit TFormDoc(QWidget *parent = nullptr);
    ~TFormDoc();
    void loadFromFile(QString &aFileName);
    QString currentFileName();
    bool isFileOpen();
    void saveToFile();
    void textEditFont();
    void textCut();
    void textCopy();
    void textPaste();
private:
    Ui::TFormDoc *ui;
    QString m_fileName;
    bool m_fileOpened=false;

};

#endif // TFORMDOC_H


/******************************.cpp********************/

#include "tformdoc.h"
#include "ui_tformdoc.h"
#include<QFile>
#include<QFileInfo>
#include<QFontDialog>
TFormDoc::TFormDoc(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::TFormDoc)
{
    ui->setupUi(this);
    setWindowTitle("New Doc[*]");
    setAttribute(Qt::WA_DeleteOnClose);
    connect(ui->plainTextEdit,&QPlainTextEdit::modificationChanged,this,&TFormDoc::setWindowModified);
}

TFormDoc::~TFormDoc()
{
    delete ui;
}

void TFormDoc::loadFromFile(QString &aFileName)
{
    QFile aFile(aFileName);
    if(aFile.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        QTextStream aStream(&aFile);
        ui->plainTextEdit->clear();
        while(!aStream.atEnd())
        {
            ui->plainTextEdit->appendPlainText(aStream.readLine());
        }

        aFile.close();
        QFileInfo fileInfo(aFileName);
        QString str=fileInfo.fileName();
        setWindowTitle(str+"[*]");
        m_fileName=str;
        m_fileOpened=true;
    }
}

QString TFormDoc::currentFileName()
{
    return m_fileName;
}

bool TFormDoc::isFileOpen()
{
    return m_fileOpened;
}

void TFormDoc::saveToFile()
{
    setWindowModified(false);
}

void TFormDoc::textEditFont()
{
    QFont font;
    font=ui->plainTextEdit->font();
    bool ok=false;
    font= QFontDialog::getFont(&ok,font);
    if(ok)
    {
        ui->plainTextEdit->setFont(font);
    }
}

void TFormDoc::textCut()
{
    ui->plainTextEdit->cut();
}

void TFormDoc::textCopy()
{
    ui->plainTextEdit->copy();
}

void TFormDoc::textPaste()
{
    ui->plainTextEdit->paste();
}

mainwindow.h和mainwindow.cpp代码如下

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


class QMdiSubWindow;
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actDocNew_triggered();

    void on_actOpen_triggered();

    void on_actFont_triggered();

    void on_actCut_triggered();

    void on_actCopy_triggered();

    void on_actPaster_triggered();

    void on_actionViewMode_triggered(bool checked);

    void on_actTile_triggered();

    void on_actCascade_triggered();

    void on_actCloseAll_triggered();

    void on_actDocSave_triggered();

    void on_mdiArea_subWindowActivated(QMdiSubWindow *arg1);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
/***************************************************.cpp*******************************/

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tformdoc.h"
#include<QMdiSubWindow>
#include<QDir>
#include<QFileDialog>
#include<QMdiSubWindow>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setCentralWidget(ui->mdiArea);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actDocNew_triggered()
{
    TFormDoc *tformDoc=new TFormDoc();
    ui->mdiArea->addSubWindow(tformDoc);
    tformDoc->show();

    ui->actCut->setEnabled(true);
    ui->actCopy->setEnabled(true);
    ui->actPaster->setEnabled(true);
    ui->actFont->setEnabled(true);

}


void MainWindow::on_actOpen_triggered()
{
    bool newNeed;
    TFormDoc *tformDoc;
    if(ui->mdiArea->subWindowList().size()>0)
    {
        tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();
        newNeed=tformDoc->isFileOpen();
    }
    else
    {
        newNeed=true;
    }

    QString curPath=QDir::currentPath();
    QString aFileName=QFileDialog::getOpenFileName(this,"打开一个文件",curPath,"c程序文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)");
    if(aFileName.isEmpty())
        return ;
    if(newNeed)
    {
        tformDoc=new TFormDoc(this);
        ui->mdiArea->addSubWindow(tformDoc);
    }

    tformDoc->loadFromFile(aFileName);

    tformDoc->show();

    ui->actCopy->setEnabled(true);
    ui->actPaster->setEnabled(true);
    ui->actCut->setEnabled(true);
    ui->actFont->setEnabled(true);
}


void MainWindow::on_actFont_triggered()
{
    TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();
    tformDoc->textEditFont();
}


void MainWindow::on_actCut_triggered()
{
    TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();
    tformDoc->textCut();
}


void MainWindow::on_actCopy_triggered()
{
    TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();
    tformDoc->textCopy();
}


void MainWindow::on_actPaster_triggered()
{
    TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();
    tformDoc->textPaste();
}


void MainWindow::on_actionViewMode_triggered(bool checked)
{
    if(checked)
    {
        ui->mdiArea->setViewMode(QMdiArea::TabbedView);
    }
    else
    {
        ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
    }
    ui->mdiArea->setTabsClosable(checked);
    ui->actCascade->setEnabled(!checked);
    ui->actTile->setEnabled(!checked);

}


void MainWindow::on_actTile_triggered()
{
    ui->mdiArea->tileSubWindows();
}


void MainWindow::on_actCascade_triggered()
{
    ui->mdiArea->cascadeSubWindows();
}


void MainWindow::on_actCloseAll_triggered()
{
    ui->mdiArea->closeAllSubWindows();
}


void MainWindow::on_actDocSave_triggered()
{
    TFormDoc *tformDoc=(TFormDoc*)ui->mdiArea->activeSubWindow()->widget();
    tformDoc->saveToFile();
}


void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{
    Q_UNUSED(arg1);
    if(ui->mdiArea->subWindowList().size()==0)
    {

        ui->actCopy->setEnabled(false);
        ui->actPaster->setEnabled(false);
        ui->actCut->setEnabled(false);
        ui->actFont->setEnabled(false);
    }

}

欢迎大家一起交流。

相关推荐
C+++Python3 分钟前
C++ 进阶学习完整指南
java·c++·学习
sparEE21 分钟前
c++值类别、右值引用和移动语义
开发语言·c++
jrrz08281 小时前
Apollo MPC Controller
c++·自动驾驶·apollo·mpc·横向控制·lateral control
小短腿的代码世界2 小时前
Qt进程间通信全体系深度解析:从QSharedMemory到本地Socket的七层武器
开发语言·qt
小王C语言3 小时前
【线程概念与控制】:线程封装
jvm·c++·算法
学习,学习,在学习3 小时前
Qt工控仪器程序框架设计详解(工控多仪器控制版本)
开发语言·c++·qt
信竞星球_少儿编程题库4 小时前
2026年全国信息素养大赛算法应用主题赛 丝路新城 C++ 模拟卷(三)
开发语言·c++
Zhang~Ling4 小时前
深入解析C++list:从0到1实现一个完整的链表类
c++·链表·list
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串综合】:[NOIP 2015 提高组] 子串
c++·字符串·csp·高频考点·子串·信奥赛
June`5 小时前
redis项目之命令解析器
数据库·c++·redis