派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?

How can a derived wxPanel's controls accessing data in it's containing wxDialog?

本文关键字:包含 数据 wxDialog 控件 wxPanel 何访问 派生 访问      更新时间:2023-10-16

我正在使用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对象是boost::property_trees 的类型定义。在整个应用程序中MyApp可访问的全局ptree。在构造过程中,对话框会动态加载每个模块的首选项页面。每个页面都是一个派生wxPanelnewPrefs包含修改后的首选项。我需要面板能够访问和更新newPrefs以便当用户退出对话框时,对话框可以负责更新主首选项数据,从而更新磁盘上的首选项文件/注册表。

我该怎么做?

<小时 />

更新 #1

澄清一下:

在构建PreferencesWindow的过程中,每个控件都被创建并放置在它们的尺寸器中。 然后创建派生自wxPanelPanel,并将其添加到对话框中TreeBook->AddPage(panelName, "Panel Caption");

通常,该对话框将从主应用程序窗口作为 ShowModal 调用。但是,现在,当我为首选项窗口创建基础时,主窗口当前被绕过了。MyApp::OnInit()直接创建并显示对话框。

我将使"首选项"对话框负责将选项写入磁盘,而不仅仅是主首选项变量。

我不确定到底是什么问题,即什么对你不起作用,但你可能会发现 TransferDataFromWindow(( 很有用:当对话框被接受时调用此方法,您通常会覆盖它以将数据从 UI 复制到内部数据结构中。

请注意,您不应该为标准wxID_OKwxID_APPLY按钮定义任何处理程序,因为默认行为应该很好(顺便说一句,如果您确实定义了这些处理程序,则使它们虚拟没有多大意义(。