框架内的osgWidget标签不会触发回调
osgWidget label within frame won't trigger the callback
这是我的问题
我是 osg 的新手,我正在尝试通过将 osgWidget::Labels 添加到 osgWidget::Box 来创建类似下拉列表的内容,然后将此框设置为 osgWidget::Frame 的 [=33] =] 所有这些工作正常,直到我点击标签后我的回调 "labelClicked" 从未真正触发的部分。
我尝试将此回调添加到其他小部件,例如输入,甚至是我将框与标签放在一起的实际框架,两者都工作正常。
这是我用来向下拉列表添加标签的函数:
osgWidget::Label* DropdownInput::createLabel(const std::string& l, unsigned int size) {
osgWidget::Label* label = new osgWidget::Label("", "");
label->setFont("fonts/Vera.ttf");
label->setFontSize(size);
label->setFontColor(1.0f, 1.0f, 1.0f, 1.0f);
label->setLabel(l);
return label;
}
void DropdownInput::addLabel(string text){
osg::ref_ptr<osgWidget::Label> label1 = createLabel(text,15);
label1->setName(text);
label1->setPadding(2.0f);
label1->setColor(1,1,1, 1);
label1->setSize(300.0f, 40);
label1->setImage( "img.png" );
label1->addCallback( new osgWidget::Callback(&DropdownInput::labelClicked, this, osgWidget::EVENT_MOUSE_PUSH) );
dropdownContent.push_back(label1); //list where I store the labels for flitering purposes
this->dropdownBox->addWidget(label1);
}
和回调:
bool DropdownInput::labelClicked(osgWidget::Event& ev) {
cout<<"label clicked!"<<endl;
return true;
}
已经尝试将标签放在框架内的框内,并将回调添加到此框架,然后将其添加到主框,但不仅没有正确调整大小,而且在过滤标签时造成延迟这不是一个选择。
还尝试了其他类型的事件,如鼠标悬停等,但仍然没有来自标签的回答。
我被要求避免使用其他 UI 库,所以如果可能的话我更喜欢基于 osgWidget 的解决方案。
所以,现在我有点迷茫了,任何帮助将不胜感激。
如果您觉得我的解释不够容易理解,请不要犹豫告诉我,因为这是我第一次在这里发帖:)
对于标签,您应该首先将推送事件添加到标签事件掩码:
label->addEventMask(osgWidget::EVENT_MOUSE_PUSH);
否则label->canMousePush()
将returnfalse
并且永远不会调用回调。
这是我的问题 我是 osg 的新手,我正在尝试通过将 osgWidget::Labels 添加到 osgWidget::Box 来创建类似下拉列表的内容,然后将此框设置为 osgWidget::Frame 的 [=33] =] 所有这些工作正常,直到我点击标签后我的回调 "labelClicked" 从未真正触发的部分。
我尝试将此回调添加到其他小部件,例如输入,甚至是我将框与标签放在一起的实际框架,两者都工作正常。
这是我用来向下拉列表添加标签的函数:
osgWidget::Label* DropdownInput::createLabel(const std::string& l, unsigned int size) {
osgWidget::Label* label = new osgWidget::Label("", "");
label->setFont("fonts/Vera.ttf");
label->setFontSize(size);
label->setFontColor(1.0f, 1.0f, 1.0f, 1.0f);
label->setLabel(l);
return label;
}
void DropdownInput::addLabel(string text){
osg::ref_ptr<osgWidget::Label> label1 = createLabel(text,15);
label1->setName(text);
label1->setPadding(2.0f);
label1->setColor(1,1,1, 1);
label1->setSize(300.0f, 40);
label1->setImage( "img.png" );
label1->addCallback( new osgWidget::Callback(&DropdownInput::labelClicked, this, osgWidget::EVENT_MOUSE_PUSH) );
dropdownContent.push_back(label1); //list where I store the labels for flitering purposes
this->dropdownBox->addWidget(label1);
}
和回调:
bool DropdownInput::labelClicked(osgWidget::Event& ev) {
cout<<"label clicked!"<<endl;
return true;
}
已经尝试将标签放在框架内的框内,并将回调添加到此框架,然后将其添加到主框,但不仅没有正确调整大小,而且在过滤标签时造成延迟这不是一个选择。 还尝试了其他类型的事件,如鼠标悬停等,但仍然没有来自标签的回答。
我被要求避免使用其他 UI 库,所以如果可能的话我更喜欢基于 osgWidget 的解决方案。
所以,现在我有点迷茫了,任何帮助将不胜感激。
如果您觉得我的解释不够容易理解,请不要犹豫告诉我,因为这是我第一次在这里发帖:)
对于标签,您应该首先将推送事件添加到标签事件掩码:
label->addEventMask(osgWidget::EVENT_MOUSE_PUSH);
否则label->canMousePush()
将returnfalse
并且永远不会调用回调。