【发布时间】:2022-07-16 13:38:04
【问题描述】:
多次尝试在滚动事件函数中传递参数后,它不起作用。
我正在制作一个自定义滚动面板,并且需要在用户向下滚动时触发绑定功能,为此我需要传递将在面板内使用的变量。这不是 wxScrolledWindow 的问题,因为我不必绑定任何东西,只需为它创建一个函数并直接调用它。
其中一些参数我不一定需要传递,因为我可以通过使用 event.GetEventObject(); 来获取它们,但其余的比如 m 这是我需要传递的地图。
在我尝试过的下面显示的解决方案中,我想在“滚动面板”内部或附近制作一个隐藏面板,以便我可以使用event.GetEventObject(); 访问它,但我将其保留为最后的努力(如果那会奏效的话)。我真的希望有一个更简单的方法。任何帮助表示赞赏。
尝试 #1
ScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &MyFrame::ScrolledWindowCreate, this)(m, ScrolledWindow, ScrolledWindowMain, ScrolledWindowSizer, initalWindowWidth));
尝试 #2
// Saw a thread that said parameters should be put outside
ScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &MyFrame::ScrolledWindowCreate, this)(m, ScrolledWindowContainerSub, ScrolledWindowMain, ScrolledWindowSizer, initalWindowWidth);
尝试 #3
// Tried to pass the arguments as the userData as in the WxWidgets documentation, the WxWidgets forums suggested it, but I looked and apparently, I need to pass in a wxObject? I don't know how a set of arguments is supposed to be turned into a wxObject
ScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &MyFrame::ScrolledWindowCreate, this, -1, (m, ScrolledWindowContainerSub, ScrolledWindowMain, ScrolledWindowSizer, initalWindowWidth);
更新:
所以我发现您需要将参数存储为 wxClientData,我相信我已经成功地做到了,但我仍然不知道如何从中提取单个项目。
struct CustomData final : public wxClientData {
int PanelNum = 20;
std::list<std::string> TagList{ "Paid", "Needs invoice" };
std::map<std::string, std::variant<std::string, std::list<std::string>>> m{ {"TIME","8:69"}, {"HEADER","Title"},{"TAGS", TagList},{"CONTENT", "Hey this is content!"} };
wxPanel* ScrolledWindowContainerSub;
wxPanel* ScrolledWindowMain;
wxBoxSizer* ScrolledWindowSizer;
int initalWindowWidth = 1300;
};
// Panels that are set as arguments below are defined here
// wxPanel* ScrolledWindowContainerSub = ...; etc...
CustomData* const myData{ new CustomData() };
myData->PanelNum, m, ScrolledWindowContainerSub, ScrolledWindowMain, ScrolledWindowSizer, initalWindowWidth;
ScrolledWindowContainerSub->SetClientObject(myData);
ScrolledWindowContainerSub->Bind(wxEVT_SCROLL_BOTTOM, &MyFrame::ScrolledWindowScrolled, this);
void MyFrame::ScrolledWindowScrolled(wxScrollEvent& event) {
wxObject* Obj = event.GetEventObject();
wxClientData* ObjClientData = static_cast<wxEvtHandler*>(Obj)->GetClientObject();
wxPanel* ObjStaticChild = dynamic_cast<wxPanel*>(ObjClientData); // Which panel will this give me? I've put two as parameters
};
【问题讨论】:
-
第一个版本有2个
(和3个),第三个版本有2个(和1个)。你能修复语法错误吗? -
@mch 我知道语法错误。这些是尝试而不是版本
-
请针对您的后续问题提出单独的问题。这使得已经存在的答案过时了。
-
@Pal,为什么不让这些变量成为滚动面板的成员?
-
@Pal,让他们成为 MyFrame 类的成员...