QT项目:03---MDI多文档界面案例

  • 本案例的基础知识来自于文章:https://blog.csdn.net/qq_41453285/article/details/98949333

QT项目:03---MDI多文档界面案例_第1张图片

一、文档类窗体的设计

  • 这个窗体类是用来放在主窗体的MDIArea组件中的

①窗体创建与设计

  • 类中只放置一个QPlainTextEdit组件,并以水平布局填充整个窗口

QT项目:03---MDI多文档界面案例_第2张图片QT项目:03---MDI多文档界面案例_第3张图片QT项目:03---MDI多文档界面案例_第4张图片QT项目:03---MDI多文档界面案例_第5张图片

②类的初始化

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组件

QT项目:03---MDI多文档界面案例_第6张图片

  • 因为要在主窗口调用刚才自己设计的MDI窗体类QFormDoc,所以加入下面的头文件

②Action设计

  • 添加了以下的Action,作为主窗体的工具栏使用

QT项目:03---MDI多文档界面案例_第7张图片

③构造函数

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();
}

QT项目:03---MDI多文档界面案例_第8张图片级联展开

QT项目:03---MDI多文档界面案例_第9张图片平铺展开

⑨其他按钮触发函数

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(
                    ui->mdiArea->activeSubWindow()->widget());
        ui->statusBar->showMessage(formDoc->currentFileName());
    }
}

 

你可能感兴趣的:(QT项目)