A. closeEvent() をオーバーライドする

ウィンドウが閉じられる直前に呼ばれます。
ここでダイアログを出して、終了をキャンセルできます。

例:終了確認ダイアログ

// MainWindow.h
protected:
    void closeEvent(QCloseEvent *event) override;

// MainWindow.cpp
#include <QCloseEvent>
#include <QMessageBox>

void MainWindow::closeEvent(QCloseEvent *event)
{
    auto ret = QMessageBox::question(
        this,
        "終了確認",
        "アプリを終了しますか?",
        QMessageBox::Yes | QMessageBox::No
    );

    if (ret == QMessageBox::Yes) {
        event->accept();   // 終了OK
    } else {
        event->ignore();   // 終了キャンセル
    }
}

B. QCoreApplication::aboutToQuit

終了をキャンセルすることはできません

処理だけしたい場合に使います。

connect(qApp, &QCoreApplication::aboutToQuit, this, [](){
    qDebug() << "アプリ終了直前";
});