没有实现GTK绘图区域

GTK drawing area is not realized

本文关键字:绘图 区域 GTK 实现      更新时间:2023-10-16

在我的应用程序中,我使用这样的Gtk::DrawingArea:

Window win;
DrawingArea area;
Box box(ORIENTATION_VERTICAL);
area.signal_realize().connect(sigc::ptr_fun(&on_video_area_realize));
box.pack_start(myWidgets, true, true);
box.pack_start(area, false, false);
win.add(box);
win.show_all();

问题是,函数on_video_area_realize没有被调用,如果我用area.get_realized()查询DrawingArea的状态,它是false,所以它还没有实现。

我不明白为什么它还没有实现?据我所知,当一个小部件被添加到一个窗口时,它就实现了——就我所知,我已经在这样做了。

当窗口(及其子窗口)被show编辑时,实现信号发生。以下代码(我使用Gtkmm 3.24.20进行了测试):

#include <iostream>
#include <gtkmm.h>
void on_video_area_realize()
{
    std::cout << "Video drawing area realized!" << std::endl;
}
int main(int argc, char *argv[])
{
    std::cout << "Gtkmm version : " << gtk_get_major_version() << "."
                                    << gtk_get_minor_version() << "."
                                    << gtk_get_micro_version() << std::endl;
    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base");
  
    Gtk::Window window;
    Gtk::Box layout{Gtk::ORIENTATION_VERTICAL};
    Gtk::Label label{"Example"};
    
    std::cout << "Checkpoint 1" << std::endl;
    
    Gtk::DrawingArea area;
    std::cout << "Checkpoint 2" << std::endl;
    area.signal_realize().connect(sigc::ptr_fun(&on_video_area_realize));
    
    std::cout << "Checkpoint 3" << std::endl;
    layout.pack_start(label, true, true);
    layout.pack_start(area, false, false);
    
    std::cout << "Checkpoint 4" << std::endl;
    window.add(layout);
    window.show_all();
    
    std::cout << "Checkpoint 5" << std::endl;
  
    return app->run(window);
}

产生以下输出:

Gtkmm version : 3.24.20
Checkpoint 1
Checkpoint 2
Checkpoint 3
Checkpoint 4
Video drawing area realized!
Checkpoint 5

从这里可以看出,绘制区域是实现了,但是没有添加到窗口中。