C++ 如何在离开(关闭或失去焦点)窗口之前显示模式确认消息?

C++ 如何在离开(关闭或失去焦点)窗口之前显示模式确认消息?,c++,qt,window,desktop,C++,Qt,Window,Desktop,我想在用户离开(alt+tab(关闭或松开焦点))主窗口之前显示确认消息框并阻止屏幕。如何做到这一点 这是我的代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setu

我想在用户离开(alt+tab(关闭或松开焦点))主窗口之前显示确认消息框并阻止屏幕。如何做到这一点

这是我的代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QMainWindow::showFullScreen();
    this->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event){
    if(event->type() == 128){
        QMessageBox::information(this, "title", "text", QMessageBox::Ok | QMessageBox::Cancel);

        return true;
    }

    return true;
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QMainWindow::showFullScreen();
此->installEventFilter(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
bool主窗口::事件过滤器(QObject*obj,QEvent*event){
如果(事件->类型()==128){
QMessageBox::信息(这是“标题”、“文本”,QMessageBox::确定| QMessageBox::取消);
返回true;
}
返回true;
}
关闭事件:

在主窗口类中重新实现
closeEvent
方法

对于窗口激活和停用事件,请尝试:


如果用户“离开”你的窗口,你的窗口就会失去焦点,这是有原因的。然而,因为这个原因而唠叨用户并不是我认为的好UI设计,而且会激怒用户(我知道这会激怒我)。而且,一个窗口松动的焦点与一个关闭的窗口完全不同。你们可能想把你们的标题更新成更合适的内容。我想在他点击“确定”或“取消”按钮之前阻止屏幕。这对我的申请很重要。这不是通常的应用。我有网络视图,如果用户想打开不同的程序(点击ok),我必须向服务器发送请求(调用RESTfulWeb服务)。完全不清楚“阻止屏幕”下的含义我还不是你的用户,但我已经讨厌你的产品了。这是一场可用性噩梦。当窗口失去焦点时,甚至不要考虑进行任何形式的模式(阻塞)交互!这是一个悲惨的坏主意。这个变体和我以前的变体一样工作。在用户单击“确定”或“取消”之前,我仍然无法阻止alt+选项卡上的屏幕。MessageBox是背景。看起来你应该用更容易理解的方式来描述你想要实现的目标。。。要“激活”窗口,您可以尝试调用方法activateWindow()或raise(),但正如我所写的,不清楚您最终想要实现什么行为请等待您的响应。我发现这个函数setWindowFlags(Qt::WindowStaysOnTopHint)。当用户在另一个程序上移动时,我希望主窗口始终保持焦点
bool MainWindow::event(QEvent * e) // overloading event(QEvent*) method of QMainWindow 
{
    switch(e->type())
    {
        // ...

        case QEvent::WindowActivate :
            // gained focus
            break ;

        case QEvent::WindowDeactivate :
            // lost focus
            break ;
        // ...
    } ;
    return QMainWindow::event(e) ;
}