2016-02-02 95 views
0

我一直試圖隱藏一個獨立的對話框應用程序,當用戶點擊典型的關閉按鈕(通常在最小化按鈕旁邊的角落中的X)I cam跨越這個帖子: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()'指令,並且一切正常。當我告訴它顯示時,該對話框隱藏並顯示備份。

任何想法爲什麼拒絕方法即使我沒有明確告訴它完全關閉我的應用程序?

+0

當您關閉對話框時,應用程序的任何其他窗口是否可見? – peppe

回答

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(); 
    } 
} 
+0

我之前遇到過這個,當我在QDialog上實現它時,只是使用了e-> ignore()行來進行快速測試,並且我的對話框停止了對X的點擊響應。讓我重試它並再次檢查。 – MrJman006

+0

無論出於何種原因,現在適用於我。謝謝您的幫助! – MrJman006