首页 > 解决方案 > 派生的 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在构建过程中,对话框会动态加载每个模块的首选项页面。每个页面都是一个派生的wxPanelnewPrefs包含修改后的首选项。我需要面板能够访问和更新newPrefs,以便当用户退出对话框时,对话框可以负责更新主要首选项数据 - 因此,磁盘上的首选项文件/注册表。

我该怎么做呢?


更新#1

澄清:

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

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

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

标签: c++boostwxwidgets

解决方案


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

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


推荐阅读