gpt4 book ai didi

c++ - 在 Juce 库中拦截 FileBrowserComponent 上的鼠标事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:23 25 4
gpt4 key购买 nike

我最近开始使用Juce library .我通常会在其论坛上发布 Juce 相关问题,但我在很多天都在为一个问题而苦苦挣扎,但我仍然没有收到任何答案。所以 stackoveflow 确实值得一试,即使这里似乎没有很多 Juce 的用户。

问题是:

我正在使用 Juce 的组件进行一些实验。我有以下类(class):

class MyComponent : public Component{

public :
MyComponent(Component * comp){
this->child = comp;
comp->setInterceptsMouseClicks(false, false);

}
void mouseDown (const MouseEvent &e){

//do stuff
Component *target = getTopChild(this->child, e.x, e.y); //return top most component of child that would have intercept the mouse event if that wasn't intercepted by MyComponent class
if (target != NULL && doIWantToForwardEventToTarget()){
MouseEvent newEvent = e.getEventRelativeTo(target);
target->mouseDown(newEvent);
}
}
void mouseMove (const MouseEvent &e);
void mouseEnter (const MouseEvent &e);
void mouseExit (const MouseEvent &e);
void mouseDrag (const MouseEvent &e);
void mouseUp (const MouseEvent &e);
void mouseDoubleClick (const MouseEvent &e);
void mouseWheelMove (const MouseEvent &e, float wheelIncrementX, float wheelIncrementY);

private:

Component *child;
}

这个类的目的是:

  1. 存储一个组件组件层次结构(子)

  2. 拦截所有鼠标相关事件 给 child 或其后代之一

  3. 做某事
  4. 最终将 MouseEvent 转发给它所指向的组件到

我在这个类中尝试使用 slider 组件作为子组件,甚至嵌套在其他组件中……一切正常。现在我正在用 FileBrowserComponent 做一些实验,它似乎不能正常工作。例如,当我单击按钮移动到上层目录时它不会(按钮接收鼠标事件并单击它但在 TreeView 中没有任何反应)。从列表中选择项目也不起作用。

可能是什么问题?(我做了一些实验,似乎没有调用 FileBrowserComponent 中的 buttonClicked 方法,但我不知道为什么)有什么建议吗?

我也试过这样修改代码:

void mouseDown (const MouseEvent &e){

//do stuff
Component *target = getTopChild(this->child, e.x, e.y); //return top most component of child that would have intercept the mouse event if that wasn't intercepted by MyComponent class
if (target != NULL && doIWantToForwardEventToTarget()){
target->setInterceptsMouseClicks(true, true);
MouseEvent newEvent = e.getEventRelativeTo(target);
target->mouseDown(newEvent);
target->setInterceptsMouseClicks(false, false);
}
}

还是不行。无论如何,我发现如果我对 setInterceptMouseClicks 的第二次调用发表评论(我在此之后禁用了鼠标单击),那么一切都会正常进行(即使这不是我想要获得的结果,因为我需要重新禁用鼠标事件)组件)。

这些事实可以让我想到 2 个考虑因素:

  1. 一个组件需要拦截鼠标单击,即使鼠标事件是手动传递给它的 mouseDown方法(这是真的吗?我不是这样确定)
  2. 鼠标事件处理后FileBrowserComponent 还有其他的使用信息的类它拦截鼠标点击状态,否则它会工作,如果之后target->mouseDown(newEvent), 我会再次禁用鼠标点击。任何想法?

提前致谢

最佳答案

你最好从 Component 创建派生类,并在这些派生类中实现它们所需的鼠标事件,当这些事件被触发时,你可以向父类发送消息,这样它就可以做其他事情。

关于c++ - 在 Juce 库中拦截 FileBrowserComponent 上的鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5965197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com