C GTK3开罗g_信号连接:不明白重点
我正试图解决这个问题,当我点击“按钮1”时,会调用“on_draw_event”函数(该函数有效),并且在我的“darea”绘图区域中会显示一条线(该函数无效) 这是我的密码:C GTK3开罗g_信号连接:不明白重点,c,gtk3,C,Gtk3,我正试图解决这个问题,当我点击“按钮1”时,会调用“on_draw_event”函数(该函数有效),并且在我的“darea”绘图区域中会显示一条线(该函数无效) 这是我的密码: #include <gtk/gtk.h> static gboolean on_draw_event(GtkWidget *button, cairo_t *darea) { printf ("function: on_draw_event\n"); cairo_set_source
#include <gtk/gtk.h>
static gboolean on_draw_event(GtkWidget *button, cairo_t *darea)
{
printf ("function: on_draw_event\n");
cairo_set_source_rgb(darea, 0, 255, 0);
cairo_set_line_width(darea, 0.5);
cairo_move_to(darea, 0, 100);
cairo_line_to(darea, 400, 100);
cairo_stroke(darea);
return FALSE;
}
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *darea;
GtkWidget *myGrid;
GtkWidget *button1;
GtkWidget *button2;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_POPUP);
myGrid = gtk_grid_new ();
darea = gtk_drawing_area_new();
gtk_widget_set_size_request(darea, 400, 400);
button1 = gtk_button_new_with_label ("BUTTON 1");
button2 = gtk_button_new_with_label ("QUIT");
gtk_grid_attach(GTK_GRID(myGrid), button1, 0, 0, 1, 1);
gtk_grid_attach(GTK_GRID(myGrid), darea, 0, 1, 1, 1);
gtk_grid_attach(GTK_GRID(myGrid), button2, 0, 2, 1, 1);
gtk_container_add(GTK_CONTAINER(window), myGrid);
g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(button1, "clicked", G_CALLBACK(on_draw_event), darea);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
#包括
静态gboolean on_draw_事件(GtkWidget*按钮,cairo_t*darea)
{
printf(“函数:在绘图事件上”);
cairo\u set\u source\u rgb(darea,0,255,0);
cairo_集_线_宽(darea,0.5);
开罗(darea,0100);
开罗线(darea,400100);
开罗(darea),;
返回FALSE;
}
int main(int argc,char*argv[])
{
GtkWidget*窗口;
GtkWidget*darea;
GtkWidget*myGrid;
GtkWidget*按钮1;
GtkWidget*按钮2;
gtk_init(&argc,&argv);
window=gtk_window_new(gtk_window_弹出窗口);
myGrid=gtk_grid_new();
darea=gtk_图纸_区域_新();
gtk_widget_set_size_request(darea,400400);
button1=gtk_按钮_新按钮_带_标签(“按钮1”);
button2=gtk_按钮_新建_,带_标签(“退出”);
gtk_网格连接(gtk_网格(myGrid)),按钮1,0,0,1,1;
gtk_网格连接(gtk_网格(myGrid),darea,0,1,1,1);
gtk_网格连接(gtk_网格(myGrid))按钮2、0、2、1、1;
gtk_容器添加(gtk_容器(窗口),myGrid);
g_信号连接(g_对象(按钮2),“单击”,g_回调(gtk_主按钮退出),空);
g_信号连接(按钮1,“点击”,g_回调(在绘图事件上),darea);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
如果我能
“g_信号连接(按钮1,“点击”,g_回调(在绘图事件中),darea);”
到
“g_信号连接(g_对象(darea),“绘制”,g_回调(在绘制事件上),NULL)”
这条线将被绘制,但我希望它等待我的按钮点击。希望有人能阻止我,这不是个大问题
谢谢。如前所述,您的示例崩溃,因为您正在将图形回调连接到单击的
信号。调用时,回调会得到无意义的参数并终止
要“等待按钮单击”,请引入一个标志,告诉您是否已单击按钮。在绘制事件的中查阅该标志,并在按钮的单击的回调中设置该标志
为实现上述功能而修改的示例如下所示:
#include <gtk/gtk.h>
static gboolean on_draw_event(GtkWidget *darea, cairo_t *cr,
gboolean *draw_line)
{
if (!*draw_line)
return FALSE;
printf ("function: on_draw_event\n");
cairo_set_source_rgb(cr, 0, 255, 0);
cairo_set_line_width(cr, 0.5);
cairo_move_to(cr, 0, 100);
cairo_line_to(cr, 400, 100);
cairo_stroke(cr);
return FALSE;
}
static void on_button1_clicked(GtkWidget *button, gboolean *draw_line)
{
*draw_line = TRUE;
/* Make sure the widget is repainted after the click.
gtk_widget_queue_draw() should better be invoked with just the
drawing area, but this code accesses the common parent for
simplicity. Passing darea in a struct whose address is provided as
user_data (along with gboolean *draw_line) is left as exercise. */
gtk_widget_queue_draw(gtk_widget_get_parent(button));
}
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *darea;
GtkWidget *myGrid;
GtkWidget *button1;
GtkWidget *button2;
gboolean draw_line = FALSE;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_POPUP);
myGrid = gtk_grid_new ();
darea = gtk_drawing_area_new();
gtk_widget_set_size_request(darea, 400, 400);
button1 = gtk_button_new_with_label ("BUTTON 1");
button2 = gtk_button_new_with_label ("QUIT");
gtk_grid_attach(GTK_GRID(myGrid), button1, 0, 0, 1, 1);
gtk_grid_attach(GTK_GRID(myGrid), darea, 0, 1, 1, 1);
gtk_grid_attach(GTK_GRID(myGrid), button2, 0, 2, 1, 1);
gtk_container_add(GTK_CONTAINER(window), myGrid);
g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(button1, "clicked", G_CALLBACK(on_button1_clicked), &draw_line);
g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), &draw_line);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
#包括
静态gboolean on_draw_事件(GtkWidget*darea、cairo_t*cr、,
gboolean*绘制线)
{
如果(!*画线)
返回FALSE;
printf(“函数:在绘图事件上”);
cairo\u set\u source\u rgb(cr,0,255,0);
cairo_集_线_宽(cr,0.5);
开罗移动到(cr,0,100);
开罗线(cr,400100);
脑卒中(cr);
返回FALSE;
}
单击按钮1上的静态空白(GtkWidget*按钮,gboolean*绘制线)
{
*绘制线=真;
/*确保在单击后重新绘制小部件。
gtk_widget_queue_draw()最好只使用
绘图区域,但此代码访问的是
简单性:在地址提供为
用户数据(连同gboolean*绘制线)留作练习*/
gtk_小部件_队列_绘制(gtk_小部件_获取_父项(按钮));
}
int main(int argc,char*argv[])
{
GtkWidget*窗口;
GtkWidget*darea;
GtkWidget*myGrid;
GtkWidget*按钮1;
GtkWidget*按钮2;
gboolean draw_line=FALSE;
gtk_init(&argc,&argv);
window=gtk_window_new(gtk_window_弹出窗口);
myGrid=gtk_grid_new();
darea=gtk_图纸_区域_新();
gtk_widget_set_size_request(darea,400400);
button1=gtk_按钮_新按钮_带_标签(“按钮1”);
button2=gtk_按钮_新建_,带_标签(“退出”);
gtk_网格连接(gtk_网格(myGrid)),按钮1,0,0,1,1;
gtk_网格连接(gtk_网格(myGrid),darea,0,1,1,1);
gtk_网格连接(gtk_网格(myGrid))按钮2、0、2、1、1;
gtk_容器添加(gtk_容器(窗口),myGrid);
g_信号连接(g_对象(按钮2),“单击”,g_回调(gtk_主按钮退出),空);
g_信号连接(按钮1,“点击”,g_回调(按钮1上点击),并绘制线);
g_信号连接(g_对象(darea),“绘制”,g_回调(在绘制事件上)和绘制线);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
非常感谢,它工作得非常完美,现在我知道如何处理这个问题了。我想给你看我的新代码,但我不知道怎么做。我可以写这篇评论。只是一个小失误,只是“返回”不起作用。我改为“return FALSE”。@Arcanix显示代码,你可以上传到并在评论中发布简短的url。我已将答案修改为返回FALSE
,感谢您的更正。谢谢您的提示。你可以在这里找到我的新代码:我知道这不是最好的代码,但它可以工作。我还没有使用struct,但我会在我的下一个项目中更多地使用它。@user\u data
的Arcanix地址应该作为“user data”参数从main
传递到g\u signal\u connect
,而不是作为全局变量保存。在这个简单的示例中,全局变量将起作用,但是如果您希望,例如,实例化两个这样的小部件,它将阻碍可重用性…再次非常感谢您!现在我想我已经按照你说的那样修好了。现在的问题是,我有两个功能来上下移动队列(在按钮上单击)和(在按钮上单击)。有没有提示我如何在一个函数中解决这个问题?