这是我的问题 我是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的解决方案。
所以,现在我有点失落,任何帮助都会非常感激。
如果你没有发现我的解释足够易于理解,请不要犹豫告诉我,因为这是我第一次在这里发帖:)
答案 0 :(得分:0)
对于标签,您应首先将推送事件添加到标签事件掩码:
label->addEventMask(osgWidget::EVENT_MOUSE_PUSH);
否则label->canMousePush()
将返回false
,并且永远不会调用回调。