FLTK 1.4:Fl_Hold_Browser重写item_draw失败,如何实现自定义绘制?
问题:无法重写Fl_Hold_Browser的item_draw实现自定义绘制
编译报错void CustomHoldBrowser::item_draw(void*, int, int, int, int)’ marked ‘override’, but does not override,核心原因是基类的item_draw是const成员函数,派生类重写时未匹配这个const修饰符。
查看Fl_Browser.H的声明,item_draw的完整签名为:
void item_draw(void* item, int X, int Y, int W, int H) const FL_OVERRIDE;
末尾的const是函数签名的必要组成部分,派生类重写时必须完全匹配签名,否则编译器会认定这是一个新函数而非对基类函数的重写。
解决方法
在派生类的item_draw函数声明和定义末尾添加const,确保与基类签名完全一致:
修改后的完整代码
#include <FL/Fl.H> #include <FL/Fl_Double_Window.H> #include <FL/Fl_Hold_Browser.H> #include <iostream> // 自定义Fl_Hold_Browser实现item_draw重写 class CustomHoldBrowser : public Fl_Hold_Browser { public: CustomHoldBrowser(int X, int Y, int W, int H, const char* L = nullptr) : Fl_Hold_Browser(X, Y, W, H, L) {} // 修正:添加const修饰符,匹配基类签名 void item_draw(void* item, int X, int Y, int W, int H) const override { const char* text = static_cast<const char*>(item); std::cout << "item_draw was called" << std::endl; // 可选:调用基类默认绘制逻辑,保留原有样式 // Fl_Hold_Browser::item_draw(item, X, Y, W, H); } }; int main(int argc, char** argv) { Fl_Double_Window* win = new Fl_Double_Window(400, 300, "Overriding item_draw"); CustomHoldBrowser* browser = new CustomHoldBrowser(10, 10, 380, 280); // 添加测试项以触发绘制逻辑 browser->add("Test Item 1"); browser->add("Test Item 2"); win->end(); win->show(argc, argv); return Fl::run(); }
如果需要保留浏览器默认的绘制样式,可以在自定义item_draw函数中调用Fl_Hold_Browser::item_draw(item, X, Y, W, H);,再追加自定义绘制代码。
内容的提问来源于stack exchange,提问作者NedM
相关产品推荐
相关产品推荐

