QT父打开子窗口后,子窗口设成独立窗口,但是关闭回到父之后程序崩
时间: 2024-05-06 07:18:49 浏览: 104
这个问题可能是因为您在关闭子窗口时没有正确地将其销毁。当您关闭一个窗口时,它仍然在内存中存在,直到您手动销毁它。如果您没有正确地销毁子窗口,它将继续占用内存,从而导致程序崩溃。
解决这个问题的方法是,在关闭子窗口时,使用delete操作符将其销毁。您可以在子窗口的closeEvent()事件中添加以下代码:
```
void MyChildWindow::closeEvent(QCloseEvent *event)
{
// 销毁子窗口
delete this;
}
```
这将在关闭子窗口时自动销毁它。同时确保在父窗口中打开子窗口时,使用`new`操作符创建子窗口对象,并将其存储在类成员变量中。例如:
```
void MyMainWindow::onOpenChildWindow()
{
// 创建子窗口对象
MyChildWindow *childWindow = new MyChildWindow(this);
// 将子窗口对象存储在类成员变量中
m_childWindow = childWindow;
// 显示子窗口
childWindow->show();
}
```
这将确保在关闭子窗口时正确地销毁它。
相关问题
QT父打开子窗口后,为什么父窗口也能看到,明明子窗口大小和父一样大啊
在Qt中,子窗口实际上是在父窗口的区域内创建的一个独立的窗口。当你打开一个子窗口时,它会显示在父窗口的区域内,但并不会遮盖父窗口本身。这就是为什么父窗口仍然可见的原因。
如果你想让子窗口完全覆盖父窗口,可以将子窗口的样式设置为`Qt::Window`,而不是默认的`Qt::Dialog`。这将使子窗口成为一个独立的窗口,而不是在父窗口内部创建一个新的窗口。你可以使用下面的代码将子窗口设置为`Qt::Window`样式:
```
childWindow->setWindowFlags(Qt::Window);
```
这将确保子窗口成为一个独立的窗口,并且不会显示父窗口。注意,这也意味着你需要自己处理子窗口的关闭和销毁。
qt 父窗口下QDialog的子窗口关闭时父窗口也会关闭
在 Qt 中,QDialog 是一个模态对话框,打开 QDialog 后,父窗口会被阻塞,直到 QDialog 关闭。如果 QDialog 关闭时会导致父窗口关闭,那么有可能是 QDialog 的父窗口设置不正确导致的。
一种可能的情况是 QDialog 的父窗口设置为了 mainwindow,而 mainwindow 在关闭时会关闭所有子窗口,因此 QDialog 的关闭也会导致 mainwindow 关闭。为了避免这种情况,应该将 QDialog 的父窗口设置为一个独立的窗口,而不是 mainwindow。
另外一种可能的情况是 QDialog 的关闭事件被重载了,关闭事件中调用了父窗口的关闭函数。如果 QDialog 关闭时确实需要关闭父窗口,可以在 QDialog 的关闭事件中调用父窗口的关闭函数,但是需要先判断 QDialog 是否为模态对话框,如果是模态对话框,应该先关闭 QDialog,然后再关闭父窗口。如果 QDialog 不是模态对话框,可以直接关闭父窗口。
示例代码如下:
```
void MyDialog::closeEvent(QCloseEvent *event)
{
if (this->parentWidget()->isModal()) {
QDialog::closeEvent(event);
this->parentWidget()->close();
} else {
this->parentWidget()->close();
QDialog::closeEvent(event);
}
}
```
这段代码在 QDialog 的关闭事件中判断了父窗口是否为模态对话框,如果是模态对话框,先关闭 QDialog,再关闭父窗口;否则,先关闭父窗口,再关闭 QDialog。
阅读全文