实现文件菜单
在这一节,我们将实现使得File menu工作的slots和private 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。