【问题标题】:Communicating between 2 panels在 2 个面板之间进行通信
【发布时间】:2011-12-08 10:37:14
【问题描述】:

在阅读 wxWiidgets 教程时,我看到了这个 Tutorial,其中作者创建了 wxPanelLeftPanelRightPanel 的 2 个子类。 p>

左边有 2 个按钮,点击右边的文字会更新。现在还有另一个类 Communicate,它有一个成员 wxPanel,其中左右面板是子面板。

左面板有一个方法->

void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event))
{
  count++;

  Communicate *comm = (Communicate *) m_parent->GetParent();
  comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
}

其中 m_text 是 Right Panel 的公共成员。

我怀疑这是否是一种很好的交流方式。 我的问题 - 这是正确的沟通方式吗?有什么更好的方法?

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    我也看过你说的教程。我认为这是一种很好的交流方式,因为它使用 wxwidgets 的连接事件方法(阅读事件以获取更多详细信息)。我不是 wxwidgets 方面的专家,但我一直使用这种方式编写我的应用程序,将类小部件的事件与类的函数相关联,然后此函数定位它必须更改属性的对象。

    无论如何,如果你认为这个事件(按下加号按钮)会经常发生,特别是,如果你有太多的功能/按钮,比如教程中的加号和减号,可以在构造函数中定义 m_text :

    在标题中:

    wxStaticText *m_textlp;
    

    在构造函数中:

    m_textlp = ( (Communicate *) m_parent->GetParent() )->m_rp->m_text;
    

    这样函数就只有:

    void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event))
    {
      count++;
      m_textlp->SetLabel(wxString::Format(wxT("%d"), count));
    }
    

    【讨论】:

    • 这仅在左面板在右面板之前构建时才有效,否则 m_textlp 的分配将取消对未初始化指针的引用。但是如果你先构建左面板,那么它就无法使用相同的技术与右面板进行通信。
    • @ravenspoint 在这个例子中,左面板是在右面板之前构建的,所以不明白为什么你说它不能使用相同的技术。
    • 因为当左面板尝试初始化m_textrp时,右面板还没有被初始化。
    • @ravenspoint 那么你的意思是:“这只有在右面板在左面板之前构建时才有效”,对吧?确实如此,但这样做并不会使左面板无法使用此技术与右面板进行通信(我刚刚测试过,它工作正常)
    猜你喜欢
    • 2015-08-04
    • 2010-09-29
    • 2016-01-31
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多