Qt4读书笔记13

实现文件菜单

在这一节,我们将实现使得File menu工作的slotsprivate functions,并管理当前打开的文件列表。

 

void MainWindow::newFile()

{

       if(okToContinue())

       {

              spreadsheet->clear();

              setCurrentFile("");

       }

}

 

newFile() slot当用户点击File|New菜单时或者点击New工具栏按钮时被调用。 okToContinue()私有方法弹出"Do you want to save your changes?"对话框。如果选择Yes或者No,返回true。如果用户选择cancel,返回false.

Spreadsheet::clear()功能清除电子表格的单元和公式。 setCurrentFile()方法更新窗口标题来显示一个untitled文档正在被编辑。

bool MainWindow::okToContinue()

{

       if(isWindowModified())

       {

              int r = QMessageBox::warning();

              if(r == QMessageBox::Yes)

              {

                     return save();

              }

              else if(r == QMessageBox::Cancel)

              {

                     return false;

              }

       }

       return true;

}

除了warning(), QMessageBox也提供了information(), question(),critical().每种对话框有自己特殊的图标。

void MainWindow::open()

{

       if(okToContinue())

       {

              QString fileName = QFileDialog::getOpenFileName(this, tr("Open Spreadsheet"), “.”,tr("Spreadsheet files (*.sp)"));

              if(!fileName.isEmpty())

                     loadFile(fileName);

       }

}

open() slot对应File|Open. newFile()类似,首先调用okToContinue()处理任何没有保存的变更。然后使用QFileDialog::getOpenFileName()来获取新文件名称。这个功能弹出一个文件对话框,让用户选择文件,并返回文件的名称,如果点击cancel就返回空字符串。

 

QFileDialog::getOpenFileName()的第一个参数是parent widget。第二个参数是对话框的标题。第三个参数起始目录,在这里设置的是当前目录。第四个参数定义了文件过滤。包括一个文本描述和一个匹配符。

 

loadFile()函数用于加载文件。我们把这个功能独立到一个函数实现是为了在加载当前打开的文件时复用:

bool MainWindow::loadFile(const QString &fileName)

{

       if(!spreadsheet->readFile(fileName))

       {

              statusBar()->showMessage(tr("Loading canceled"), 2000);

              return false;

       }

 

       setCurrentFile(fileName);

       statusBar()->showMessage(tr("File loaded"), 2000);

       return true;

}

 

使用Spreadsheet::readFile()从磁盘读文件。如果成功,调用setCurrentFile()修改window标题;否则提示用户有问题。提示信息显示2

 

bool MainWindow::save()

{

       if(curFile.isEmpty())

       {

              return saveAs();

       }

       else

       {

              return saveFile(curFile);

       }

}

bool MainWindow::saveFile(const QString &fileName)

{

       if(!spreadsheet->writeFile(fileName))

       {

              statusBar()->showMessage(tr("saving canceled"), 2000);

              return false;

       }

 

       setCurrentFile(fileName);

       statusBar()->showMessage(tr("File saved"), 2000);

       return true;

}

 

bool MainWindow::saveAs()

{

       QString fileName = QFileDialog::getSaveFileName(this, tr("Save spreadsheet"), ".", tr("Spreadsheet files(*.sp)"));

       if(fileName.isEmpty())

              return false;

       return saveFile(fileName);

}

 

QFileDialog::getSaveFileName()功能从用户获取文件名,如果重名,提示用户是否覆盖。

 

void MainWindow::closeEvent(QCloseEvent *event)

{

       if(okToContinue())

       {

              writeSettings();

              event->accept();

       }

       else

       {

              event->ignore();

       }

}

 

点击File|Exit是调用这个函数,QWidget::close()发送close事件到widget

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值