QWidget没有关闭 - 留空窗口

时间:2015-03-31 22:05:11

标签: qt events qwidget

我遇到QWidget衍生物(NewPayment)的问题。它是一个简单的窗口,带有一些控件和QDialogButtonBox。它有2个插槽:

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

有趣的是,当我要么:

  • 点击&#39; X&#39;在tre右上角
  • 从主窗口调用QMdiArea::closeActiveSubWindow()
  • 从主窗口调用QMdiArea::closeAllSubWindows()

窗口正确关闭。我为我的班级覆盖了QWidget::closeEvent(QCloseEvent * event)

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

并且它每次都显示出相同的事件 - 无论我如何尝试关闭它:

[ 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

最好的部分是,当我点击&#34;取消&#34; (窗口被清除,但保持打开状态),然后单击&#34; X&#34;或者其他 - 窗口关闭,但控件没有通过我的NewPayment::closeEvent(我有一个制动点 - 它不会触发)。

在其他窗口中,它的工作原理大致相同。奇怪的是,我确信它之前(+ - 一周前)对其他窗口有效(它们在点击OK执行所有必要操作后关闭)。我想我会从SVN结束analyzyig diff,但也许有人有类似的问题?我最近睡得很少,所以也许我错过了一些微不足道的事情?

我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您期望什么,小部件不是窗口。您可以通过关闭窗口小部件获得输出,但这与关闭窗口不同。

如果要关闭窗口,则需要有窗口句柄。你可以:

  • 保持从addSubWindow()
  • 返回的指针
  • 提前创建窗口,创建窗口的窗口小部件,将窗口小部件设置为窗口小部件,然后使用窗口小部件parent()访问窗口。

答案 1 :(得分:0)

我遵循了@ddriver的建议,结束了

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

现在它按照预期的方式工作。