Qt -- MainWindow实现文本新建/打开/保存/另存

文地址: Qt -- MainWindow实现文本新建/打开/保存/另存为及字体大小颜色的改变 作者: 阿福

今天用MainWindow类创建一个简单的文本,实现简单的新建、打开、另存为、保存,及字体大小颜色的改变。

一首先创建一个MainWindow类

 [转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

这里不要用到Generate form.

 

运行下出现如下
[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

 

现在我们要在上述MainWindow中添加文本编辑框、File菜单,里面包含新建、打开、另存为、保存,以及在工具栏里添加新建、打开、保存快捷图标。

首先先实现文本编辑框

为了方便我们把头文件的#include<QtGui/QMainWindow> 改成#include<QtGui >

在上述MainWindow类里声明

QPlainTextEdit textEdit;

在构造函数里写入

this->setCentralWidget(textEdit); //意思就是只用一个textEdit文本编辑框填充

运行后如下:

[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

 

接下来实现File菜单和添加工具栏

首先先填加图标

创建一个Qt Resource File
[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

后面一直按下去。创建后填加

先把F:QT4.7.3examplesmainwindowsapplication中的images文件夹的图标复制到你的工程里,上面是我的路径。

 

先选择mainwindow.grc  的Add/prefix把prefix改成/,然后Add/Files ,选择刚才images里的所有图标

如下图所示:

[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

 

下面就是实现菜单file简单功能的图标显示 的代码

在mainwindow.h的MainWindow类里声明:

QAction *newAction;//新建

QAction*openAction;//打开

QAction*saveAction;//保存

QAction*saveAsAction;//另存为

QAction*closeAction;//关闭

QMenu*fileMenu;  //fileMenu菜单

QToolBar*fileToolBar;//fileToolBar工具栏

 

 

在mainwindow.cpp的mainWindow的构造函数里写如下代码:

**************************************************
API里的函数原形 QAction ( const QIcon & icon,const QString & text, QObject * parent)
 新建这个行为包含图标,名字是New ,&说明crtl+N是快捷键,下面出现的&都是同样的意思,父类是MainWindow.

newAction = newQAction(QIcon(":/images/new.png"),"&New",this);
openAction = newQAction(QIcon(":/images/open.png"),"&Open",this);
saveAction = newQAction(QIcon(":/images/save.png"),"&Save",this);
saveAsAction = new QAction("Save&As",this);
closeAction = newQAction("close",this);
************************************************

*********************************************
在菜单栏里添加File菜单
File菜单里添加打开、新建、保存、另存为、关闭等行为选项
fileMenu =this->menuBar()->addMenu("&File");
fileMenu->addAction(newAction);
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addAction(saveAsAction);
fileMenu->addAction(closeAction);

*************************************************

*********************************************
在工具栏里添加打开、新建、保存等图标 行为选项

fileToolBar =this->addToolBar("File");
fileToolBar->addAction(newAction);
fileToolBar->addAction(openAction);
fileToolBar->addAction(saveAction);
****************************************************

运行结果

[转载]Qt <wbr>-- <wbr>MainWindow实现文本新建/打开/保存/另存

 

上面只是显示图标、选项,还没有实际功能,接下来实现这些功能。

在mainwindow.h的MainWindow类里声明:

     QStringcurrentName;//当前文本的文件名

   bool maybeSave();//判断当前文本是否保存

   void setCurrentFile(const QString&);//设置当前文本的文件名

   bool saveFile(const QString &);//保存文本

   void loadFile(constQString &);//打开文本

 

    public slots:

   void slotNew();//新建文本的槽

   void slotOpen();//打开文本的槽

   bool slotSave();//保存文本的槽

   bool slotSaveAs();//另存为文本的槽

 

在mainwindow.cpp 的MainWindow的构造函数里添加如下代码:

*****************************************************************

在菜单File里或工具栏里单击新建、打开、保存、另存为、关闭等信号产生对应的槽的实现  

QObject::connect(newAction,SIGNAL(triggered()),this,SLOT(slotNew()));  QObject::connect(openAction,SIGNAL(triggered()),this,SLOT(slotOpen()));   QObject::connect(saveAction,SIGNAL(triggered()),this,SLOT(slotSave()));  QObject::connect(saveAsAction,SIGNAL(triggered()),this,SLOT(slotSaveAs()));  QObject::connect(closeAction,SIGNAL(triggered()),qApp,SLOT(quit()));

*****************************************************************

 

 

在mainwindow,cpp里实现mainwindow.h方法、槽,代码如下

****************************************************************
函数作用:判断文件是否保存了
textEdit.document()->isModified()是判断文本编辑的内容是否被修改
如果被修改就跳出一个警告对话框,问是否保存、忽略、取消。
QMessageBox::warning()是警告对话框实现,里面参数依次是parent即MainWindow类,对话框标题,文本内容,三个按钮选择:save/discard/cancle
如果选择保存,执行保存方法;
如果选择取消,返回false;
如果没被修改,返回true
*****************************************************************
bool MainWindow::maybeSave()
{
   if(textEdit.document()->isModified())
    {
       QMessageBox::StandardButton ret;
       ret = QMessageBox::warning(this,
                                  "warning",
"the document has been modified,Do you want to save yourchange",                                  QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel
                                  );
       if(ret == QMessageBox::Save)
           return slotSave();
       if(ret == QMessageBox::Cancel)
           return false;
    }
    else
       return true;
}

***********************************************************
函数作用:设置当前文本名
如果文本名是空,就设为Untitle.txt,
如果不为空,就把当前文本名设为fileName

textEdit.document()->setModified(false);
this->setWindowModified(false);
这两句是使文本编辑 和窗口处于没被修改的状态
*********************************************************
void MainWindow::setCurrentFile(const QString&fileName)
{
    currentName= fileName;
   textEdit.document()->setModified(false);
   this->setWindowModified(false);
   fileName.isEmpty() ?
               this->setWindowFilePath("Untitle.txt"):
               this->setWindowFilePath(fileName);
}
*********************************************************
函数作用:新建文件点击后实现的方法(槽)
当点击新建,如果当前以有打开的文本,先判断文本是否被修改,如果没被修改,直接把文本编辑的内容清掉,并把新建的文本名设为Untitle.txt。
有被修改,就执行maybeSave()里的 return slotSave();进行保存
 ************************************************************   
void MainWindow::slotNew()
{
   if(maybeSave())
    {
       textEdit.clear();
       setCurrentFile("");
    }
}

****************************************
函数作用:点击保存所实现的方法(槽)
如果当前文本名为空,就执行另存为方法
如果不为空,就执行保存文本的方法
*************************************
bool MainWindow::slotSave()
{
   if(currentName.isEmpty())
       return slotSaveAs();
    else
       return saveFile(currentName);
}

*******************************************
函数作用:把文本编辑的内容保存到文本里面
先新建文本,打开文本,如果打开失败会跳出一个错误对话框,显示不能写
如果打开成功,新建一个文本流out,把文本编辑的内容都输出到文本流,并设置当前的文本名为保存时写的文本名。

**********************************************
boolMainWindow::saveFile(const QString &fileName)
{
    QFilefile(fileName);
   if(!file.open(QFile::WriteOnly|QFile::Text))
    {
       QMessageBox::critical(this,
                             "critical",
                             "cannot write file"
                             );
       return false;
    }
    else
    {
       QTextStream out(&file);
       out<<textEdit.toPlainText();
       setCurrentFile(fileName);
       return true;
    }
}

***********************************
函数作用:点击另存为选项实现的方法
点击另存为跳出文件对话框,输入另存为名字并把改名字赋值给fileName
如果没输入另存为名字取消掉,返回false
如果输入,用这个名字保存文本
**************************************
bool MainWindow::slotSaveAs()
{
    QStringfileName =QFileDialog::getSaveFileName(this);
   if(fileName.isEmpty())
       return false;
    else
       return saveFile(fileName);
}
***************************************
函数作用:点击打开选项实现的方法(槽)
点击打开文本,先判断当前已经打开的文本是否保存
如果保存了,就跳出文件对话框,输入要打开的文件名,并把该文件名赋值给fileName,fileName不为空,打开该文件
********************************************
voidMainWindow::slotOpen()
{
   if(maybeSave())
    {
       QString fileName = QFileDialog::getOpenFileName(this);
       if(!fileName.isEmpty())
           loadFile(fileName);
    }
}

 

**********************************************
函数作用:打开fileName这个文件
先打开fileName文本,如果打开失败,跳出一个错误对话框,并返回
如果打开成功,把该文本的内容都读到文本编辑上,并设置当前文本的文件名为fileName.
****************************************************************
void MainWindow::loadFile(constQString &fileName)
{
    QFilefile(fileName);
   if(!file.open(QFile::ReadOnly|QFile::Text))
    {
       QMessageBox::critical(this,
                             "critical",
                             "cannot read file"
                             );
       return;
    }
    else
    {
       QTextStream in(&file);
       textEdit.setPlainText(in.readAll());
       setCurrentFile(fileName);
    }
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值