gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:37:33 24 4
gpt4 key购买 nike

我正在发现 GTK,但我遇到了多个问题...这是其中之一。

我有一个“数据”结构和一个包含菜单栏和绘图区域的窗口。该区域有一个绘图函数“DrawRefresh_callback”,专门用于绘制Data中描述的内容。

目前,我可以在创建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 与数据结构的方式......

提前致谢。

最佳答案

如果我没猜错的话,您会更改您的“模型”(=您的数据结构)以响应某些事件,并希望绘图区域相应更新。

我建议不要从另一个事件处理程序(即从处理菜单激活信号的处理程序)中调用绘图例程,而是将重绘操作排入队列。为此,请使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com