如何通过父窗口获取控件的文本值(wxDialog场景)
先拆解你代码里的几个潜在问题,一步步排查解决:
1. 栈对象的调用方式错误
你创建的settingsWindow是栈上的实例(settingsFrm settingsWindow(this, "Settings");),但后续调用settingsWindow->FindWindowByName用了指针运算符->,这明显不对!栈对象应该用.来调用成员函数,改成settingsWindow.FindWindowByName才是正确的写法,这可能是直接导致运行时崩溃的原因之一。
2. FindWindowByName默认不递归查找子控件
wxWindow::FindWindowByName默认只会查找当前窗口的直接子控件,如果你的keywords_txt文本框嵌套在子面板、多层sizer容器里,直接调用这个方法是找不到目标控件的。这时候需要使用递归查找的版本:
settingsWindow.FindWindowByName("keywords_txt", true);
第二个参数设为true,就会递归遍历所有层级的子控件,这样就能找到深层嵌套的目标控件了。
3. 必须先检查指针有效性,避免空指针崩溃
无论如何,都不能直接把FindWindowByName的结果强转后立刻调用GetValue——万一找不到控件,返回的是nullptr,dynamic_cast后依然是空指针,调用成员函数必然触发运行时错误。正确的写法是先判断指针是否有效:
wxTextCtrl* keywordsCtrl = dynamic_cast<wxTextCtrl*>(settingsWindow.FindWindowByName("keywords_txt", true)); if (keywordsCtrl) { wxLogMessage(keywordsCtrl->GetValue()); } else { wxLogMessage("Failed to find control 'keywords_txt'!"); }
4. 确认控件的Name属性确实设置正确
最后再核对一遍keywords_txt控件的创建代码:确保在构造时指定了正确的name参数,比如:
wxTextCtrl* keywordsTxt = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, "keywords_txt");
如果是用wxFormBuilder设计的对话框,要在控件属性面板里把Name字段准确设置为keywords_txt,拼写、大小写都要完全一致,别出现笔误。
按照上面的步骤调整代码,应该就能正常获取到文本控件的值了。
内容的提问来源于stack exchange,提问作者Lion King

