wxWidgets开发中如何从孙级按钮触发祖父级主按钮的点击事件
你构造完wxCommandEvent后直接调用主按钮的ProcessWindowEvent方法即可触发对应的点击事件处理逻辑,还有几个细节可以优化避免后续出问题:
- 事件ID需要设置为主按钮的ID,你当前代码用的是弹窗内按钮的ID,会导致主按钮按ID绑定的事件处理函数匹配不到事件
- 动态转换
wxPopupTransientWindow后最好加判空逻辑,避免极端场景下转换崩溃 - 用
GetGrandParent硬拿主按钮指针依赖固定的层级关系,后续如果调整弹窗容器结构很容易失效,建议你自定义弹窗类时新增一个成员变量存储主按钮指针,初始化时直接传入,可靠性更高
修改后的完整代码如下:
void expandButton::mouseReleased(wxMouseEvent& evt) { if (pressed) { pressed = false; paintNow(); wxWindow* mBtn = this->GetGrandParent(); // 可增加类型判断确保拿到的是你的自定义主按钮实例,此处省略 if (!mBtn) return; mBtn->SetLabel(this->GetLabel()); mBtn->Refresh(); wxCommandEvent event(wxEVT_BUTTON); event.SetId(mBtn->GetId()); // 替换为主按钮ID,匹配对应事件处理 event.SetEventObject(mBtn); mBtn->ProcessWindowEvent(event); // 触发主按钮的点击事件处理 wxPopupTransientWindow* popup = wxDynamicCast(this->GetParent(), wxPopupTransientWindow); if (popup) { popup->Dismiss(); } } }
如果你后续需要传递选中选项的额外参数,可以自定义继承自wxCommandEvent的事件类,当前仅需要触发主按钮默认点击逻辑的话,上述实现已经满足需求。
内容的提问来源于stack exchange,提问作者iKebab897
相关产品推荐
相关产品推荐

