无法从对话框关闭应用程序(Qt应用程序)

时间:2017-01-09 02:11:53

标签: c++ qt

正确使用它我有一个MainWindow和一个对话窗口,如果满足条件就会执行但问题是如果单击对话框窗口中的取消按钮,我无法让应用程序退出。我已经尝试将qApp-> quit()放入取消按钮的插槽功能中。我尝试通过对话框类的clickme()信号将取消按钮插槽连接到MainWindow对象的预定义关闭插槽。 (如下图所示)

qt application does not quit我读到了这个问题的答案,我认为这让我很接近,因为它让我意识到在展示MainWindow之前我不能退出应用程序,但是做出改变并没有解决问题。我甚至试图从取消按钮插槽显式发出clickme()信号,但这实际上导致操作系统抛出一个信号,告诉我“由于它从操作系统信号名称收到信号,因此它已经停止,因为它接收到来自操作系统信号名称的信号:SIGSEGV 信号含义:分段错误“

这是我的代码:

Notice warning; // this is the object for the dialog window also all of this code is in main.cpp
 warning.setModal(true);
    QObject::connect(&warning, SIGNAL(clickme()), &warning, SLOT(on_Cancel_button_clicked()));
    QObject::connect(&warning, SIGNAL(clickme()), &w, SLOT(close()));
    warning.exec();

此代码之前

MainWindow w;
w.show();

同时在写这个问题时我尝试了这个

QObject::connect(&warning, SIGNAL(clickme()), qApp, SLOT(quit()));

但那仍然无效。如果您需要更多信息,请告诉我。

更新:我开始认为我在使用这个连接信号/插槽功能时遇到这么多麻烦的原因是因为它不是为了连接两个不同类的两个窗口而设计的,我应该重新设计我的应用来做所有事情来自MainWindow类,这是一个耻辱,因为当我想象一个GUI程序时,我想象多个窗口相互连接,无论代表每个窗口的对象是否来自与其他窗口相同的类,但我有这么难的尝试做在尝试连接不同类的对象时使用QT框架。

更新:请原谅我。我假设我最初认为的代码是可行的,并且在实际测试该代码之前暂停了对该程序的处理。回到现在,我发现它不起作用。我所指的代码如下

QMessageBox msg;
    msg.setText("Continue?");
    msg.addButton(QMessageBox::Yes);
    msg.addButton(QMessageBox::No);
    QObject::connect(&msg, &QMessageBox::rejected,
                     &app, &QApplication::quit); // this line doesn't work for me and I don't know why
    QObject::connect(&msg, &QMessageBox::accepted, [&dlg]{
      (new QLabel("I'm running")).show();
    });

2 个答案:

答案 0 :(得分:0)

QApp->退出();应该管用。删除warning.setModal(true);调用exec()时,对话框变为模态。根据Qt文档,SetModal(true)应与show()一起使用。所以这可能会导致你的问题。

答案 1 :(得分:0)

我想我已经发现了这个问题。

您可能会两次致电exec()

  1. 输入QApplication事件循环
  2. 执行对话框。
  3. 使用show()代替exec()进行对话。您有一个示例,您可以检查信号/插槽是否正常工作。在您的应用程序中,您需要使用插槽关闭窗口,但是:

    1. 使用代码行dialog.exec();,应用程序继续运行。这是你的问题。
    2. 使用代码行dialog.show();,应用停止。
    3. 顺便说一句,我看到你的上一个问题更新了,但是不正确。实际上,您当然可以连接两个不同的类。

      <强> window.h中

      #ifndef WINDOW_H
      #define WINDOW_H
      
      #include <QApplication>
      #include <QMainWindow>
      #include <QAbstractButton>
      #include <QDebug>
      #include "dialog.h"
      
      class Window : public QMainWindow
      {
      Q_OBJECT
      
      public:
          Window()
          {
              dialog = new Dialog();
              dialog->setText("Continue?");
              dialog->addButton(QMessageBox::Yes);
              dialog->addButton(QMessageBox::No);
              auto onClick = [this]() {
                  auto role = dialog->buttonRole(dialog->clickedButton());
                  if (role == QMessageBox::NoRole) {
                      qDebug() << "QMessageBox::NoRole";
                      QApplication::quit();
                  }
                  if (role == QMessageBox::YesRole) {
                      qDebug() << "QMessageBox::YesRole";
                  }
              };
      
              QObject::connect(dialog, &QMessageBox::buttonClicked, onClick);
      
              dialog->show(); // this must be show(), not exec()
          }
          virtual ~Window() { delete dialog; }
      private:
          Dialog *dialog;
      
      public slots:
          void windowSlot() { qDebug() << Q_FUNC_INFO;
                              close();
                            }
      };
      
      #endif // WINDOW_H
      

      <强> dialog.h

      #ifndef DIALOG_H
      #define DIALOG_H
      
      #include <QMessageBox>
      
      class Dialog : public QMessageBox
      {
      Q_OBJECT
      
      public:
          Dialog() {}
          virtual ~Dialog() {}
      };
      
      #endif // DIALOG_H
      

      <强>的main.cpp

      #include <QApplication>
      #include <QtGui>
      #include "window.h"
      
      int main(int argc, char **argv)
      {
          QApplication app(argc, argv);
      
          Window window;
          window.setWindowTitle("window");
          window.show();
      
          return app.exec();
      }
      

      更新#1:非常有趣post