如何在 Qt 中为文本编辑程序实现 "Do you want to save changes?" 对话框?

How to implement "Do you want to save changes?" dialog for a text editing program in Qt?

我用Qt框架用C++写了一个类似记事本的文本编辑程序。它只有基本功能,如撤消、重做等。我想显示一个对话框,如果用户没有保存他的更改,它会出现,并询问 he/she 是否想要保存类似于记事本中的更改和其他此类程序。我该如何处理?

你可以这样做:

        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();
}