C 如何在自定义GtkWidget中添加GtkWidget?
我制作了一个定制的GTK小部件,需要添加一个GTK按钮,以便在定制小部件中继承其信号。自定义小部件是一个时间轴,所以我想使用GTK按钮来避免弄乱鼠标坐标。当用户想要移动按钮所代表的图片或只是延长时间线本身的延迟时,按钮小部件将发出信号,我的生活将更加轻松 当然,该按钮不会显示在时间线上。那是我的问题。我知道我必须把按钮放在一个容器中,但如何在绘图功能中做到这一点?有人知道怎么做吗?我在谷歌上搜索了一下这里,但运气不好 这是自定义小部件绘制功能:C 如何在自定义GtkWidget中添加GtkWidget?,c,gtk,gtk3,custom-widgets,C,Gtk,Gtk3,Custom Widgets,我制作了一个定制的GTK小部件,需要添加一个GTK按钮,以便在定制小部件中继承其信号。自定义小部件是一个时间轴,所以我想使用GTK按钮来避免弄乱鼠标坐标。当用户想要移动按钮所代表的图片或只是延长时间线本身的延迟时,按钮小部件将发出信号,我的生活将更加轻松 当然,该按钮不会显示在时间线上。那是我的问题。我知道我必须把按钮放在一个容器中,但如何在绘图功能中做到这一点?有人知道怎么做吗?我在谷歌上搜索了一下这里,但运气不好 这是自定义小部件绘制功能: static gboolean img_timel
static gboolean img_timeline_draw(GtkWidget *da, cairo_t *cr)
{
GtkWidget *button;
ImgTimelinePrivate *priv = img_timeline_get_instance_private((ImgTimeline*)da);
gint width = gtk_widget_get_allocated_width(da);
cairo_translate (cr, 0 , 12);
img_timeline_draw_time_ticks(da, cr, width);
//Video timeline
cairo_translate (cr, 0 , 20);
cairo_set_source_rgba(cr, priv->video_background[0], priv->video_background[1], priv->video_background[2], priv->video_background[3]);
cairo_set_line_width(cr, 1);
cairo_rectangle(cr, 0,10, width - 2, 59);
cairo_fill(cr);
//separator
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_rectangle(cr, 0,69, width - 2, 3);
cairo_fill(cr);
//Audio timeline
cairo_set_source_rgba(cr, priv->audio_background[0], priv->audio_background[1], priv->audio_background[2], priv->audio_background[3]);
cairo_rectangle(cr, 0,72, width - 2, 59);
cairo_fill(cr);
button = gtk_button_new_with_label("I'm invisible...");
gtk_widget_set_realized(button, TRUE);
gtk_widget_show(button);
return FALSE;
}
这是主要的:
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Imagination timeline widget");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 800, 200);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
GtkWidget *timeline = img_timeline_new();
g_object_set(timeline, "total_time", 300, NULL);
g_object_set(timeline, "video_background", "#0084ff", NULL);
g_object_set(timeline, "audio_background", "#0084ff", NULL);
gtk_widget_add_events( timeline, GDK_BUTTON1_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_SCROLL_MASK
| GDK_KEY_PRESS_MASK );
GtkWidget *scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
GtkWidget *viewport = gtk_viewport_new(NULL,NULL);
g_signal_connect( G_OBJECT(timeline), "scroll-event", G_CALLBACK(img_timeline_scroll), scrolledwindow1);
gtk_widget_set_hexpand(viewport, TRUE);
gtk_widget_set_vexpand(viewport, TRUE);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
gtk_container_add (GTK_CONTAINER(viewport), timeline);
gtk_container_add (GTK_CONTAINER(scrolledwindow1), viewport);
gtk_container_add (GTK_CONTAINER (window), scrolledwindow1);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
好的,解决方案是将GtkLayout子类化,而不是将GtkDrawingArea子类化,并在自定义小部件绘图函数中使用gtk_container_propagate_draw() 好的,解决方案是将GtkLayout子类化,而不是将GtkDrawingArea子类化,并在自定义小部件绘图函数中使用gtk_container_propagate_draw()