【发布时间】:2016-02-26 15:40:05
【问题描述】:
我用 Qt 框架用 C++ 编写了一个类似于记事本的文本编辑程序。它只有基本功能,如撤消、重做等。我想显示一个对话框,如果用户没有保存他的更改并询问他/她是否要保存类似于记事本和其他中的更改这样的程序。我应该如何处理?
【问题讨论】:
标签: c++ qt qt5 text-editor
我用 Qt 框架用 C++ 编写了一个类似于记事本的文本编辑程序。它只有基本功能,如撤消、重做等。我想显示一个对话框,如果用户没有保存他的更改并询问他/她是否要保存类似于记事本和其他中的更改这样的程序。我应该如何处理?
【问题讨论】:
标签: c++ qt qt5 text-editor
你可以这样做:
Document unsaveDocument = getUnsaveDocument();
if (unsaveDocument.isModified()) {
QMessageBox *alert = new QMessageBox;
alert->setWindowTitle("File is modified");
alert->setText("Do you want to save your changes?");
alert->setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
alert->setDefaultButton(QMessageBox::Save);
int ret = alert->exec();
alert->deleteLater();
if (ret == QMessageBox::Save) {
saveDocument();
} else {
doSomeThing(); //When discard or cancel
}
}
【讨论】:
Qt 的documentation for QMessageBox 对此进行了讨论并提供了以下示例:-
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
msgBox.setInformativeText("Do you want to save your changes?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
// Save was clicked
break;
case QMessageBox::Discard:
// Don't Save was clicked
break;
case QMessageBox::Cancel:
// Cancel was clicked
break;
default:
// should never be reached
break;
}
应用程序可以通过aboutToQuit 信号来监控它们何时将要退出,这是您将提示用户的地方。
例如(with C++ 11)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MainWindow w;
// Note Qt 5 connect syntax with C++ 11 lambda function
QObject::connect(qApp, &QCoreApplication::aboutToQuit, [&w](){
qDebug() << "Terminating - Goodbye!\n";
//Display msg prompt here
if(QMessageBox::question(NULL, "Test", "Save?", QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes)
{
// if result is save...
w.save();
}
});
w.show();
return a.exec();
}
【讨论】:
QTextDocument,你可以使用它的changed信号,否则你必须自己监控。然后,维护一个布尔标志,在加载文档时将其设置为 false。进行任何更改后,将其设置为 true,然后在保存后将其设置回 false。
aboutToQuit 不能在此处使用,请参阅文档:“如果您的应用程序必须进行最后一秒的清理,该信号特别有用。请注意,在此状态下无法进行用户交互。” closeEvent 需要被覆盖才能说“不,不要退出”。