我正在发现GTK并且我有多个问题......这是其中之一。
我有一个“数据”结构和一个包含菜单栏和drawingArea的窗口。 该区域有一个绘图功能“DrawRefresh_callback”,专门用于绘制数据中描述的内容。
目前,我可以在创建DrawingArea时连接点击信号进行绘制:
g_signal_connect(G_OBJECT(DrawingArea), "button-press-event", G_CALLBACK(Draw_callback), pData);
事实上,通过这样做,我可以访问Draw_callback中的数据和DrawingArea小部件。
当我使用菜单时,我能够调用一个名为Data_addLine的函数来修改Data.I当我连接“activate”信号时,我给出了一个指向Data的指针。 (我甚至不确定这是做这件事的好办法。)
g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(Data_addLine), pData);
但是,我想通过从Data_addLine调用DrawRefresh_callback来刷新绘图区域。而且我不知道如何做到这一点:在Data_addLine中我无法访问drawingWidget(除了使用了很多“gtk_widget_get_parent”......)。
我完全迷失了......我甚至难以解释我的问题...... 希望这很清楚......
也许这不是将Gtk用于数据结构的方法......
提前致谢。
答案 0 :(得分:0)
如果我找到了你,你改变了你的模型" (=您的数据结构)以响应某些事件并希望绘图区域相应地更新。
我建议不要从另一个事件处理程序(即处理菜单激活信号的处理程序)中调用绘图例程,而是将其重新排队。请使用gtk_widget_queue_draw(Draw);
。
然后,在事件处理程序中,您需要两个引用。一个是数据结构,另一个是绘图区域的小部件。您可以为此使用全局变量,也可以使用包含所有必要变量的结构(下例中为appdata
),然后您可以方便地将其传递给事件处理程序。
typedef struct {
GtkWidget *DrawingArea;
sometype_t *Data;
...
} appdata_t;
static gboolean on_menuitem_activate(GtkMenuItem *menuitem, appdata_t *appdata)
{
do_some_work(appdata->Data);
gtk_widget_queue_draw(appdata->DrawingArea);
return FALSE;
}
...
int main(...)
{
appdata_t appdata;
appdata.DrawingArea = gtk_drawing_area_new();
appdata.Data = some_initialization_function();
...
g_signal_connect(pMenuItem, "activate", on_menuitem_activate, &appdata);
...
}