在GTK +中执行操作后刷新窗口

时间:2014-03-12 12:48:25

标签: c gtk3

我正在发现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用于数据结构的方法......

提前致谢。

1 个答案:

答案 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);
    ...
}