You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:42:19