QMainWindow的close()信号未发出。

6
为了在关闭继承自 QMainWindow 的窗口之前发出警告,我重新实现了其 closeEvent,当我手动发出 close() 时,它可以正常工作。但是,单击“x”按钮不会触发此操作; 它只是退出。
它确实为应用程序发出 aboutToQuit(),我可以在窗口关闭后使用它来“恢复”窗口。 但是我希望警告先于初始关闭出现。
我不确定问题出在哪里。 窗口是顶级的,并且没有正在运行的线程。 我是否误解了实际连接到按钮单击的信号...? 它确实是 close(),对吗?

1
请发布您的 closeEvent 代码(最好是一个 SSCCE:http://sscce.org/)。此外,`close()` 是一个槽,而不是一个信号。 - RA.
2个回答

5
在你的mainwindow类头文件中(closeEvent必须是虚函数):
public:
    /*!
     * \brief closeEvent
     * \param event
     */
    virtual void closeEvent ( QCloseEvent * event );

在C++中:
void MainWindow::closeEvent( QCloseEvent *event )
{
    //! Ignore the event by default.. otherwise the window will be closed always.
    event->ignore();

    if(!EntitiesSaverObserver::Instance()->isAllSaved())
    {
        QMessageBox msgBox;
        msgBox.setWindowIcon(QIcon(":/Resources/Icons/warning.png"));
        msgBox.setIconPixmap(QPixmap(":/Resources/Icons/warning.png"));
        QString strToShow = QString("Some Entities has been created or modified...");
        msgBox.setText(strToShow);
        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
              qDebug() << "SAVE";
              //! Do your stuff here
              // ....
              event->accept();
              break;
            }
          case QMessageBox::Discard:
            {
                // Don't Save was clicked
                qDebug() << "DISCARD";
                event->accept();
                break;
            }
          case QMessageBox::Cancel:
            {
              // Cancel was clicked
              qDebug() << "CANCEL";
              break;
            }
          default:
              // should never be reached
              break;
        }
    } else {
        event->accept(); // Do not need to save nothing... accept the event and close the app
    }
}

另外,如果你想在工具栏中放置一个QAction按钮,你可以连接信号,然后:

void MainWindow::on_actionExit_triggered()
{
    close();
}

这会调用您主窗口的关闭事件。我希望这能帮到你。

-2
只需创建一个信号槽 QObject::connect(yourButton, SIGNAL(clicked()), this, SLOT(close()));

没有足够的声望来发表评论。 - haris
这是相反的情况; 让一个按钮关闭窗口。 OP询问如何在close()操作之前进行操作,而不是执行close()的方法。 - Ruud van Gaal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接