【问题标题】:How to destroy the child window after closing?关闭后如何销毁子窗口?
【发布时间】:2018-03-23 12:28:34
【问题描述】:

我已提出以下申请:

正如您在单击父窗口中的设置按钮时看到的那样,会打开一个名为“设置”的新子窗口,但不幸的是,当关闭该子窗口时,它并没有关闭并保持隐藏状态。当再次打开子窗口时,它会创建另一个子窗口的实例,依此类推。

问题是关闭父窗口时它没有关闭并保留在task manager -> processes

// Creates an instance of child window
void mainfrm::settings_btnOnButtonClick(wxCommandEvent & event) {
    this->settingWindow = new settingsfrm(this);
    settingWindow->ShowModal();
}

// When closing the child window
void settingsfrm::cancel_btnOnButtonClick(wxCommandEvent & event) {
    this->EndModal(0);
}

// When destroying the variable that contains the instance of child window
mainfrm::~mainfrm() {
    settingWindow = NULL;
    delete settingWindow;
}

【问题讨论】:

  • 我不知道你的问题,但这看起来非常糟糕:settingWindow = NULL;删除设置窗口;
  • 尝试交换这两行,settingWindow = NULL bit
  • settingWindow 应该包装在一个智能指针中,如果它不是共享的则为 unique_ptr(否则为 shared_ptr)

标签: c++ wxwidgets


【解决方案1】:

根据the documentation

模态对话框是 wxWindow 派生的极少数例子之一 可以在堆栈上而不是在堆上创建的对象

所以你的第一个代码块可以这样写(假设 settingsfrm 是从 wxDialog 派生的):

// Creates an instance of child window
void mainfrm::settings_btnOnButtonClick(wxCommandEvent & event) {
    settingsfrm settingWindow(this);
    int i = settingWindow.ShowModal();

    //if necessary, do something with i here
}

您的主应用程序框架将等待设置窗口显示,然后设置窗口超出范围时自行删除。不需要在主框架中存储用于 settingWindow 的指针。

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    相关资源
    最近更新 更多