我发现了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。我在连接“ 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与Data结构一起使用的方法...

提前致谢。

最佳答案

如果我理解正确,您可以响应某些事件而更改“模型”(=您的数据结构),并希望相应地更新绘图区域。

我建议不要从另一个事件处理程序(即从处理菜单激活信号的处理程序)中调用绘制例程,而应加入重绘操作。为此使用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);
    ...
}

关于c - 在GTK +中执行操作后刷新窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22352079/

10-10 04:22