2015-03-31 32 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