帧内的osgWidget标签不会触发回调

时间:2015-03-12 20:07:19

标签: c++ callback event-handling openscenegraph

这是我的问题 我是osg的新手,我试图通过将osgWidget :: Labels添加到osgWidget :: Box然后将这个相同的框设置为osgWidget :: Frame的窗口来创建类似下拉列表的东西,所有这一切都正常,直到单击标签后,我的回调“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的解决方案。

所以,现在我有点失落,任何帮助都会非常感激。

如果你没有发现我的解释足够易于理解,请不要犹豫告诉我,因为这是我第一次在这里发帖:)

1 个答案:

答案 0 :(得分:0)

对于标签,您应首先将推送事件添加到标签事件掩码:

label->addEventMask(osgWidget::EVENT_MOUSE_PUSH);

否则label->canMousePush()将返回false,并且永远不会调用回调。