2015-03-31 62 views
1

我有一個QWidget衍生物(NewPayment)的問題。這是一個簡單的窗口,有一些控件和QDialogButtonBox。它有2個插槽:QWidget的不打烊 - 只剩下空空的窗口

void NewPayment::on_buttonBox_accepted() { 
    //(some action going in here) 
    this->close(); 
} 

void NewPayment::on_buttonBox_rejected() { 
    this->close(); 
} 

當我單擊確定或取消 - 插槽按預期觸發。問題是,該窗口不會關閉。所有的內容消失,並留下一個空的窗口(窗口標題是左)。

小部件存在的MDISubwindow,並創建像這樣:

void HurBudClientGUI::addNewPayment(int direction, int contractorid) { 
    foreach(QMdiSubWindow* it, this->ui.mainArea->subWindowList()) { 
     if (NewPayment* np = qobject_cast<NewPayment*>(it->widget()) ) { 
      if (np->getContractorID() == contractorid) { 
       this->ui.mainArea->setActiveSubWindow(it); 
       return; 
      } 
     } 
    } 
    NewPayment* np = new NewPayment(direction, contractorid, this); 
    np->setAttribute(Qt::WA_DeleteOnClose); 
    this->ui.mainArea->addSubWindow(np); 
    np->show(); 
} 

有趣的是,當我要麼:

  • 點擊在TRE右上角的「X」角落
  • 呼叫QMdiArea::closeActiveSubWindow()從主窗口
  • 從主窗口調用QMdiArea::closeAllSubWindows()

窗口被正常關閉。我已經覆蓋一個QWidget::closeEvent(QCloseEvent * event)我的課:

void NewPayment::closeEvent(QCloseEvent * event) { 
    qDebug() << "[" << __FUNCTION__ << "]:" << "event: " << event << "; sender:" << sender(); 
} 

而且很多preety顯示了同樣的事件,每次 - 無論我怎樣嘗試關閉它:

[ NewPayment::closeEvent ]: event: QCloseEvent(Close, 0x40bd64, type = 19) ; sender: QDialogButtonBox(0x4dfa7a8, name = "buttonBox") // I hit cancel 
[ NewPayment::closeEvent ]: event: QCloseEvent(Close, 0x40b634, type = 19) ; sender: QObject(0x0) // I hit the 'X' in the window corner 
[ NewPayment::closeEvent ]: event: QCloseEvent(Close, 0x40b468, type = 19) ; sender: QObject(0x0) // I hit "close active sub window" from parent window 
[ NewPayment::closeEvent ]: event: QCloseEvent(Close, 0x40b454, type = 19) ; sender: QObject(0x0) // I hit "close all sub windows" from parent window 

最好的部分是,當我點擊「取消」(窗口被清除,但保持打開狀態),然後點擊「X」或其他 - 窗口關閉,但控制不通過我的NewPayment::closeEvent(我有一個剎車點 - 它不火) 。

它的工作原理preety很多在其他窗口一樣。奇怪的是,我很確定它以前(+ - 一週前)對其他窗口(它們在單擊確定螞蟻執行所有必要的操作後關閉)工作。我想我會結束從SVN analyzyig差異,但也許有人有類似的問題?我最近睡得很少,所以也許我錯過了一些微不足道的東西?

我會很感激任何幫助。

回答

0

我跟着@ddriver的建議,並結束了與

void NewPayment::on_buttonBox_rejected() { 
    if (QMdiSubWindow* psw = qobject_cast<QMdiSubWindow*>(this->parent())) { 
     psw->close(); 
    } else { 
     this->close(); 
    } 
} 

現在的作品,因爲它是應該。

1

你期望什麼,一個小部件不是一個窗口。您從關閉窗口小部件獲得輸出,但這與關閉窗口不一樣。

如果您想關閉窗口,您需要有一個窗口句柄。你可以:

  • 保持從addSubWindow()
  • 返回的指針事先創建窗口,創建父到窗口小部件,設置窗口小部件的窗口小部件,然後使用Widget的parent()訪問窗口。
+1

謝謝。我遵循你的方式,並實現我所需要的 – murison 2015-04-01 17:28:40