文章目录
3.4 实现File菜单
在这一节中,将实现那些能够让File菜单项正常工作并且能够对最近打开文件进行管理的槽函数和私有函数。
void MainWindow::newFile()
{
/* 当用户点击File->New菜单项或者单击工具栏上的New按钮时,就会调用newFile()槽。
* 如果存在还没有被保存的信息, okToContinue( )私有函数就会弹出对话框:“Do you wantto save your changes?"。
* 如果用户选择Yes或者No(保存文档应该选择Yes),这个函数会返回true;
* 如果用户选择Cancel,它就返回false。 Spreadsheet::clear()函数会清空电子制表软件中的全部单元格和公式。
* setCurentFile()私有函数会更新窗口的标题,以说明正在编辑的是一个没有标题的文档,它还会设置curFile私有变量并且更新最近打开文件的列表。
*/
if (okToContinue()) {
spreadsheet->clear();
setCurrentFile("");
}
}
bool MainWindow::okToContinue()
{
//在okToContinue()函数中,会检测windowModifed属性的状态。如果该属性的值是true,就显示一个如下图所示的消息框。这个消息框包含一个Yes按钮、一个No按钮和一个Cancel按钮。
//QMessageBox::warning(parent, title, message, buttons);
if (isWindowModified()) {
int r = QMessageBox::warning(this, tr("Spreadsheet"),
tr("The document has been modified.\n"
"Do you want to save your changes?"),
QMessageBox::Yes | QMessageBox::No
| QMessageBox::Cancel);
if (r == QMessageBox::Yes) {
return save();
} else if (r == QMessageBox::Cancel) {
return false;
}
}
return true;
}
QMessageBox提供了许多标准按钮,并且会自动尝试着让其中的一个成为默认的确认按钮(在用户按下Enter键时会得到激活) ,一个成为默认的退出按钮(在用户按下Esc时会得到激活)。选择一些特殊的按钮作为默认的确认按钮和退出按钮也是有可能的,用户还可以自定义按钮中将要显示的文本内容。
除了warning( )之外,QMessageBox还提供了information( )、question( )和critical( )函数,它们每一个都有自己特定的图标,这些图标如图3.10所示。
void MainWindow::open()
{
/* open()槽对File->Open做出响应。就像newFile()一样,它首先调用okToContiniue()函数来处理任何没有被保存的变化。
* 然后它使用方便的QFileDialog::getOpenFileName()静态函数从用户那里获得一个新的文件名。
* 这个函数会弹出一个文件对话框,让用户选择一个文件,并且返回这个文件名——或者,如果用户单击了Cancel按钮,则返回一个空字符串。
*/
if (okToContinue()) {
/* 传递给QFileDialog::getOpenFileName()函数的第一个参数是它的父窗口部件。
* 用于对话框和其他窗口部件的这种父子对象关系意义并不相同。
* 对话框通常都拥有自主权,但是如果它有父对象,那么在默认情况下,它就会居中放到父对象上。
* 一个子对话框也会共用它的父对象的任务栏。
* 第二个参数是这个对话框应当使用的标题。
* 第三个参数告诉它应当从哪一级目录开始,在这个例子中就是当前目录。
* 第四个参数指定了文件过滤器。文件过滤器(filter)由一个描述文