【问题标题】:How do I add ScrolledWindow support to a custom Widget in GtkMM?如何将 ScrolledWindow 支持添加到 GtkMM 中的自定义小部件?
【发布时间】:2011-01-11 21:31:15
【问题描述】:

我正在为 Gtkmm 编写一个自定义小部件,它应该显示一个巨大的数据集(想象一下像 4096x256 字符数据表之类的东西)。

主要是出于优雅的原因,但也可能在 Glade/Gtk-Builder 编辑器中使用,我希望这个小部件本机支持 ScrolledWindow,也就是说,一旦它被设置为 ScrolledWindow 的子级,它就会被识别为一个可滚动的小部件,允许在其上设置水平和垂直调整对象,随后可以对其进行篡改。

似乎是这样,我需要在我的小部件的构造函数中做这样的事情:

// get Gtk C type from wrapper class
GtkWidget* gwidget = this->gobj();

// imagine code here that magically creates a gobject signal, 
// that we can catch in C++.
// this is actually the part which I don't know how to do.
guint my_signal = magic_way_to_create_this_signal(
                   &MyClass::rainbow_unicorn_signal_handler);

// make ScrolledWindow recognize this window as scrollable
GTK_WIDGET_GET_CLASS(gwidget)->set_scroll_adjustments_signal = my_signal;

稍后,添加小部件时ScrolledWindow发出的信号需要通过信号代理方法或其他什么被我的Widget捕获?我不知道。

我该怎么做?

【问题讨论】:

    标签: gtk signals gtkmm adjustment scrolledwindow


    【解决方案1】:

    magic_way_to_create_this_signal”是g_signal_new()。您可以在小部件的my_widget_class_init() 函数中调用它,这是定义类的 GObject 方式的一部分。我不太确定 Gtkmm 中的等价物是什么。

    另请参阅 GTK 文档中的 footnote,其中解释了为什么制作原生可滚动的小部件如此麻烦。

    您还可以将小部件放入 Gtk::Viewport 中,从而为其子小部件添加滚动功能。

    【讨论】:

    • C++ 绑定使用 libsigc++ 进行信号管理。我不知道这将如何处理普通的 C 信号......
    • 也许在 C 中实现该信号是有意义的,因为 guint 是由 GObject 内部确定的信号处理程序 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多