【问题标题】:How to implement "Do you want to save changes?" dialog for a text editing program in Qt?如何实现“您要保存更改吗?” Qt中文本编辑程序的对话框?
【发布时间】:2016-02-26 15:40:05
【问题描述】:

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

【问题讨论】:

    标签: c++ qt qt5 text-editor


    【解决方案1】:

    你可以这样做:

            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
               }
           }
    

    【讨论】:

      【解决方案2】:

      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。
      • 如果要使用您的示例,如何实现取消功能?
      • 如果要取消关闭应用,可以在MainWindow的closeEvent中检查保存,而不是main函数。
      • aboutToQuit 不能在此处使用,请参阅文档:“如果您的应用程序必须进行最后一秒的清理,该信号特别有用。请注意,在此状态下无法进行用户交互。” closeEvent 需要被覆盖才能说“不,不要退出”。
      猜你喜欢
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2011-03-27
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多