[C++] 32 FLTK: 親子ウィジェットを消去するコールバック [移植完了]

前回の続きです。

表示させたモーダルダイアログを消すコールバックを作成しました。最初は汎用ポインタvoid*の扱い方がわかりませんでした。

モーダルダイアログとOKボタンの親子関係を構築させ、ボタンを押すと親子ウィジェット共に消去するといった内容です。解決するまではOKボタンを押すとボタンだけが消えるという怪現象に取りつかれていました。

FLTKの仕様にひたすら振り回されました。当たり前の話ですが、つじつまが合うように書いていけばいずれ解決するという感じです。時間的コスパはとてつもなく悪いですね。

FLTKはあらゆる機能をカバーしていますが、実装するのが本当に大変です。これでQtのような遅さだったらとてもやってられないです。

続けてFl_Multiline_Outputにスクロールバーを付けようとしたところ、ドラッグ&ドロップができなくなったので止めました。スクロールバーがなくてもカーソルを動かせば見えなくなった行を確認できます。

リサイズ時の背景黒化は解決し堅牢性もそれなりの水準に達したので、PNG用アプリとしてPyQt6からの移植を一旦完了とします。

#include "modalDialog.h"
#include <string>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Widget.H>
 
Fl_Button *button;

modalDialog::modalDialog(int w, int h, const char* title, const char* msg)
    : Fl_Window(w, h, title){

    int ws, hs, xs, ys;
    int margin_x = 70;
    int margin_y = 15;

    ws = 60;
    hs = 25;
    xs = w - ws - margin_x;
    ys = h - hs - margin_y;

    // メッセージ
    Fl_Box *g = new Fl_Box(0, 0, w, h-40, msg);
        
    // OKボタン
    button = new Fl_Button(xs, ys, ws, hs, "OK");
    button->parent(this);
    button->callback(PushButtonOK,this);
    button->down_box(FL_UP_BOX);

    resizable(this);
    end();
}

modalDialog::~modalDialog()
{
}

void modalDialog::PushButtonOK(Fl_Widget* widget,void* x)
{
    Fl_Group* window = widget->parent();
    window->hide();
}

背景色黒化対策

img = cv::imread(path,cv::IMREAD_UNCHANGED);