我发现了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/