c++ - 派生的 wxPanel 的控件如何访问包含 wxDialog 的数据?
问题描述
我正在使用 wxWidgets 3.1.3 和 Boost 1.73。
处理模块化应用程序的自定义首选项对话框,这是标题的相关部分:
class PreferencesWindow : public wxDialog {
public:
PreferencesWindow(...); // Constructor
protected:
wxButton* DialogButtonsApply;
wxButton* DialogButtonsCancel;
wxButton* DialogButtonsOK;
wxTreebook* TreeBook;
private:
enum {
// Enumerated Window Ids
};
// Event Handlers
virtual void OnTreeSelection(wxTreeEvent& event);
virtual void OnApplyButton(wxCommandEvent& event);
virtual void OnCancelButton(wxCommandEvent& event);
virtual void OnOkayButton(wxCommandEvent& event);
DECLARE_EVENT_TABLE();
pt::ptree newPrefs;
public:
const pt::ptree &getNewPrefs() const;
void setNewPrefs(const pt::ptree &newPrefs);
};
pt::ptree
对象是s的typedef boost::property_tree
。在整个应用程序ptree
中都有一个可访问的全局变量。MyApp
在构建过程中,对话框会动态加载每个模块的首选项页面。每个页面都是一个派生的wxPanel
。newPrefs
包含修改后的首选项。我需要面板能够访问和更新newPrefs
,以便当用户退出对话框时,对话框可以负责更新主要首选项数据 - 因此,磁盘上的首选项文件/注册表。
我该怎么做呢?
更新#1
澄清:
在构造 的过程中PreferencesWindow
,每个控件都被创建并放置在它们的 sizer 中。Panel
, 派生自然wxPanel
后被创建并添加到对话框中TreeBook->AddPage(panelName, "Panel Caption");
通常,对话框将作为 ShowModal 从主应用程序窗口调用。然而,现在,当我为 PreferencesWindow 创建基础时,主窗口当前被绕过了。直接创建并显示MyApp::OnInit()
对话框。
我将使首选项对话框负责将选项写入磁盘,而不仅仅是主要的首选项变量。
解决方案
我不确定到底是什么问题,即究竟是什么对您不起作用,但您可能会发现TransferDataFromWindow()有用:当对话框被接受时调用此方法,您通常会覆盖它以从UI 到您的内部数据结构中。
请注意,您不应为标准wxID_OK
和wxID_APPLY
按钮定义任何处理程序,因为默认行为应该很好(顺便说一句,如果您确实定义了这些处理程序,将它们设为虚拟没有多大意义)。
推荐阅读
- google-analytics - 如何减少 API 调用次数(Google Analytics API)
- django - Django 全局变量是在所有用户还是单个用户之间共享?
- powerpivot - 电源查询时间另存为日期
- wordpress - 发布新帖子后触发链接
- python - Python - 当单个 ip 元素时,将 ip 地址列表处理为字符串列表
- html - 子边框半径相同时父背景泄露
- r - R - 使用函数打印数据帧的值带来 NULL 值
- java - 如何在 Java Spring Boot 应用程序中正确地从 redis 获取数据
- r - 您可以使用 R 包 drake 制定多个计划吗?
- c - 在大型项目上运行 Clang-Tidy