Qt:多文档(MDI)文档处理软件思路01

文档处理软件是我们日常生活中最为常用的软件之一。在此以将记事本为例子,实现的基本思路描述。

一:基本外观功能。

1)有菜单栏和按钮,根据不同的实现功能,将按钮添加到菜单中,并且添加工具栏。

2)主窗口显示(在此不同于记事本,为多文本窗口)。

在Qt中按钮的显示以QAction来替代,菜单和工具栏为QMenu和QToolBar,部分代码如下:

    //in file menu.
    QAction* pActionNew;
    QAction* pActionOpen;
    QAction* pActionSave;
    QAction* pActionSaveAs;
    QAction* pActionExportPdf;
    QAction* pActionExit;

    QMenu* pMenuFile;
    QMenu* pMenuWindow;

因为主窗口是多文档显示,所以要在主窗口添加QMdiArea,以保存多文档。

QMdiArea* pMdiArea;

因为每个QAction实例都需对应一个相应的方法,故声明new、open、save、saveas、print、exit等file菜单需调用的方法。

以下为完整的mainwindow.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QMdiArea;
class QAction;
class TextEditor;
class QMenu;
class QActionGroup;
class TextEditor;
class QCloseEvent;
class QDragEnterEvent;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    virtual void closeEvent(QCloseEvent* cle);

private:
    void setupFileMenuActions();

    void setupMenusAndToolbar();

    /**
      @brief add TextEditor instance to MDIArea.
      @param editor TextEditor instance.
    */
    void addEditor(TextEditor* editor);

    /**
      @brief new a file in MDIArea.
    */
    void newFile();

    /**
      @brief open a exist file.
    */
    void openFile();

    /**
      @brief save file in defalut configuration.
    */
    bool save();

    /**
      @brief save file by user option.
    */
    bool saveAs();

    /**
      @brief export file in pdf format.
    */
    void exportInPdfFormat();

    /**
      @brief find the active TextEditor and return it.
      @return active TextEditor instance in MDIArea.
    */
    TextEditor* activeEditor();

private:
    Ui::MainWindow *ui;

    //in file menu.
    QAction* pActionNew;
    QAction* pActionOpen;
    QAction* pActionSave;
    QAction* pActionSaveAs;
    QAction* pActionExportPdf;
    QAction* pActionExit;

    QMenu* pMenuFile;
    QMenu* pMenuWindow;

    QMdiArea* pMdiArea;
    QActionGroup* pWindowMenuGroup;

    static QString mResWinPath;
};

#endif // MAINWINDOW_H

因为此程序为多窗口(Mdi)程序,所以针对程序中不同的文本框有不同的配置,例如文档保存情况,是否为active,不同的文件名及路径,所以将具体对文档的操作实现在文档类中(QTextEdit的子类),mainwindow只是对其的具体调用。

以下是mainwindow.cpp的具体实现:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMdiArea>
#include <QAction>
#include <QMenu>
#include <QMdiSubWindow>
#include <QActionGroup>
#include <QCloseEvent>
#include <QDragEnterEvent>

#include "texteditor.h"

QString MainWindow::mResWinPath = ":/images/win/";

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    pMdiArea(new QMdiArea(this)),
    pWindowMenuGroup(new QActionGroup(this))
{
    ui->setupUi(this);
    setCentralWidget(pMdiArea);

    setupFileMenuActions();

    setupMenusAndToolbar();

    setAttribute(Qt::WA_DeleteOnClose);
    setAcceptDrops(true);
}

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

void MainWindow::closeEvent(QCloseEvent* cle)
{
    pMdiArea->closeAllSubWindows();

    if ( !pMdiArea->subWindowList().isEmpty()) {
        cle->ignore();
    } else {
        cle->accept();
    }
}

void MainWindow::setupFileMenuActions()
{
    pActionNew = new QAction(QIcon(MainWindow::mResWinPath + "filenew.png"),
                             tr("&New"),
                             this);
    pActionNew->setShortcut(QKeySequence::New);
    pActionNew->setPriority(QAction::LowPriority);
    pActionNew->setStatusTip(tr("Create a new file"));
    connect(pActionNew, &QAction::triggered, this, &MainWindow::newFile);

    pActionOpen = new QAction(QIcon(MainWindow::mResWinPath + "fileopen.png"),
                              tr("&Open"),
                              this);
    pActionOpen->setShortcut(QKeySequence::Open);
    pActionOpen->setPriority(QAction::LowPriority);
    pActionOpen->setStatusTip(tr("Open a file"));
    connect(pActionOpen, &QAction::triggered, this, &MainWindow::openFile);

    pActionSave = new QAction(QIcon(MainWindow::mResWinPath + "filesave.png"),
                              tr("&Save"),
                              this);
    pActionSave->setShortcut(QKeySequence::Save);
    pActionSave->setStatusTip(tr("save this file"));

    pActionSaveAs = new QAction(tr("Save As"), this);
    pActionSaveAs->setShortcut(QKeySequence::SaveAs);
    pActionSaveAs->setStatusTip(tr("Save this file as..."));
    connect(pActionSaveAs, &QAction::triggered, this, &MainWindow::saveAs);

    pActionExportPdf = new QAction(QIcon(MainWindow::mResWinPath + "exportpdf.png"),
                                   tr("Export Pdf"),
                                   this);
    pActionExportPdf->setStatusTip(tr("export file in pdf format"));
    connect(pActionExportPdf, &QAction::triggered, this, &MainWindow::exportInPdfFormat);

    pActionExit = new QAction(tr("E&xit"), this);
    pActionExit->setShortcut(QKeySequence::Quit);
    pActionExit->setStatusTip(tr("Exit this application"));
    connect(pActionExit, &QAction::triggered, qApp, &QApplication::closeAllWindows);
}

void MainWindow::setupMenusAndToolbar()
{
    pMenuFile = ui->menuBar->addMenu(tr("&File"));
    pMenuFile->addAction(pActionNew);
    pMenuFile->addAction(pActionOpen);
    pMenuFile->addAction(pActionSaveAs);
    pMenuFile->addAction(pActionExportPdf);
    pMenuFile->addAction(pActionExit);

    QToolBar* tb = addToolBar(tr("FileToolBar"));
    tb->addAction(pActionNew);
    tb->addAction(pActionOpen);
    tb->addAction(pActionSave);
    tb->addAction(pActionExportPdf);

    pMenuWindow = ui->menuBar->addMenu(tr("&Window"));
}

void MainWindow::addEditor(TextEditor* editor)
{
    //Add action to windowMenuGroup for RadioGroup.
    pMenuWindow->addAction(editor->windowMenuAction());
    pWindowMenuGroup->addAction(editor->windowMenuAction());

    QMdiSubWindow* subWindow = pMdiArea->addSubWindow(editor);
    subWindow->show();
    subWindow->setFocus();
}

void MainWindow::newFile()
{
    //Create a new editor and add it to MDIArea.
    TextEditor* editor(new TextEditor(this));
    editor->newFile();
    addEditor(editor);
}

void MainWindow::openFile()
{
    //Call TextEditor::open method for user to choose file.
    TextEditor* editor = TextEditor::open(this);

    //true If choose file successfully,add the file to MDIArea.
    if ( editor) {
        addEditor(editor);
    }
}

bool MainWindow::save()
{
    TextEditor* editor = activeEditor();

    if ( editor) {
        return editor->save();
    } else {
        return false;
    }
}

bool MainWindow::saveAs()
{
    TextEditor* editor = activeEditor();

    if ( editor) {
        return editor->saveAs();
    }

    return false;
}

void MainWindow::exportInPdfFormat()
{
    TextEditor* editor = activeEditor();

    if ( editor) {
        editor->fileExportToPDF();
    }
}

TextEditor* MainWindow::activeEditor()
{
    QMdiSubWindow* subWindow = pMdiArea->activeSubWindow();

    if ( subWindow) {
        return qobject_cast<TextEditor*>(subWindow->widget());
    } else {
        return 0;
    }
}
时间: 2024-09-29 02:31:47

Qt:多文档(MDI)文档处理软件思路01的相关文章

仿百度文库、豆丁文档在线文档带全套工具

这个是非常棒的一套在线文档分享系统源码,仿百度文库.豆丁文档网站源码,在这里完全免费提供给大家学习.在这里无需任何币就可以下载到非常多的精品源码,如果觉得好站长资源做的不错,请帮忙推荐给更多的站长朋友,并且里面还有一个设置说明图.    此套源码非常干净的,不像现在很多所谓VIP源码论坛放大量的垃圾广告文件在里面,更没有在里面加入垃圾加密广告代码.    安装以下软件前,先要在本机装好OFFICE2007   net2.0以上    windows2003 系统   退掉杀毒软件切忌! 1:安装

稻米文档助手——文档库01

稻米文档助手——文档库01已经提供下载了. 主要收集的是C++/Win32/MFC方面的资料. 文档库下载地址:Part1: http://download.csdn.net/detail/lifeandc/8421437 Part2: http://download.csdn.net/detail/lifeandc/8421451 下载解压后,通过选择 开始-->文档库页面的 添加 命令,添加文档库即可使用.

Word 主控文档与子文档(免费课程资料)

课程简介:Word中的主控文档与子文档这个功能,对于大部分人来说,应该是不太了解的,不了解就更谈不上应用了.这也是制作这个视频课程的目的,希望更多的人能够了解并在需要时能真正应用到工作中.那在什么时候能用到这个功能呢?当有一个大文档需要拆分成多个小文档分工合作时:当你正在写一本书或写一篇论文想一章保存为一个文档,最后再把所有的小文档合并成一个大文档来组织管理时,这个功能就非常有意义了.这个视频课程主要讲了如何创建主控文档,以及如何在主控文档中管理子文档,相信大家学完,对主控文档与子文档这个功能将

java将office文档pdf文档转换成swf文件在线预览

java将office文档pdf文档转换成swf文件在线预览 第一步,安装openoffice.org   openoffice.org是一套sun的开源office办公套件,能在widows,linux,solaris等操作系统上执行. 主要模块有writer(文本文档),impress(演示文稿),Calc(电子表格),Draw(绘图),Math(公式),base(数据库) 笔者下载的是openoffice.org 3.3.0.下载完直接安装即可.      但是,我们还需要启动openof

创建MFC应用程序的类型:单文档+多文档+基于对话框

单文档支持文档视图架构,数据的保存--(读取--修改)文档类功能--显示(视图类功能),比较方便. 基于对话框,主窗口是对话框类型,可以方便的使用控件,所见即所得的编程,比较方便. 单文档类似"记事本"这样的应用程序,是文件处理软件的开发基础,只是每个应用程序仅处理一个文档(与多文档相比较). 基于对话框类似"计算器"这样的应用程序,没有需要处理的文档,一般是工具软件的开发基础. 基于对话框(3个类): CAboutDlg 程序名App 程序名Dlg 单文档(5个类

Lucene是如何理解文档的 & 文档类型(Types)是如何被实现的

Lucene是如何理解文档的 在Lucene中,一份文档(Document)由一系列简单的字段-值(field-value)对组成.一个字段必须有值,同时允许包含多值.同样的,一个单一的字符串在分析处理过程中可能被转换成多个值.Lucene不关心值到底是字符串.数字还是日期--所有的值都以不可理解的比特值(opaque)对待. 当我们在Lucene中索引一份文档时,值和字段在反向索引(inverted index)中被关联起来.可选项的是,是否将原始值存储起来以便今后使用,存储后的值是不可更改的

Android L / 5.0 帮助文档 API21文档 sample demo源码 下载

如无法登陆google,浏览android官网也是问题,这里提供android L的官方文档资料下载.API版本21 参考文档较大,解压后最好使用IE浏览器打开,并工具选项卡中设置为脱机工作模式, 如是,则打开文档速度会加快许多.否则发送js请求等待google响应,会出现加载十分缓慢的现象. 也可修改网页源码,使之不发送访问google的请求,请自行百度,etc 如果想用google搜索,又无法打开google网站,可以试用下谷粉搜索 http://www.gfsoso.com/ Androi

48.输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)

//1.输入一个数,将其每一位分离,并保存如一个数组 //2.判断数组最后录入的一位是第几位 //3.循环判断是否满足回问数的要求 #include<iostream> using namespace std; int main() { int n,temp; int k=0; int a[20]; cout<<"please input an number: "<<endl; cin>>n; for(int i=0;i<20;i+

49.输入一字符串,检查是否回文 (回文是指正反序相同,如,LeveL)

(1) #include<iostream> using namespace std; int main() { int k=0; int j; char b[20]; cout<<"please input an number: "<<endl; cin>>b; for(j=0;j<20&&b[j]!='\0' ;j++); //字符串有一个结束符,判断它可知是否结束 { k=j; } for(int m=0;m&