Qt对话框X按钮覆盖拒绝不按预期工作

时间:2016-02-02 20:56:02

标签: c++ qt

当用户点击典型的关闭按钮时,我一直试图隐藏一个独立的对话框应用程序(角落中的X通常位于最小化按钮旁边)我在这篇文章中提到:

Qt: How do I handle the event of the user pressing the 'X' (close) button?

我认为会有我的解决方案,但是当我实现它时会出现奇怪的行为。

void MyDialog::reject()
{
    this->hide()
}

当我点击X按钮时,整个应用程序关闭(进程消失),这不是我想要的。由于我的gui使用命令行生成,我设置了一个测试系统,我可以通过文本命令告诉我的对话框,我调用相同的'this-> hide()'指令,一切正常。该对话框会隐藏,然后在我告诉它显示时显示回来。

任何想法为什么拒绝方法完全关闭我的应用程序,即使我没有明确告诉它?

1 个答案:

答案 0 :(得分:0)

在对话框类中重写虚函数“virtual void closeEvent(QCloseEvent * e)”。代码注释将详细解释。

Dialog::Dialog(QWidget *parent) :QDialog(parent), ui(new Ui::Dialog){
    ui->setupUi(this);
}
Dialog::~Dialog(){
    delete ui;
}
//SLOT
void Dialog::fnShow(){
    //Show the dialog
    this->show();
}
void Dialog::closeEvent(QCloseEvent *e){
    QMessageBox::StandardButton resBtn = QMessageBox::question( this, "APP_NAME",
                                         tr("Are you sure?\n"),
                                         QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                         QMessageBox::Yes);

    if (resBtn != QMessageBox::Yes){
        //Hiding the dialog when the close button clicked
        this->hide();
        //event ignored
        e->ignore();
        //Testing. To show the dialog again after 2 seconds
        QTimer *qtimer = new QTimer(this);
        qtimer->singleShot(2000,this,SLOT(fnShow()));
        qtimer->deleteLater();
    }
    //below code is for understanding
    //as by default it is e->accept();
    else{
        //close forever 
        e->accept();
    }
}