问题描述
我制作了一个自定义 GTK 小部件,我需要向其中添加一个 GTK 按钮,以便在自定义小部件中继承其信号。自定义小部件是一个时间线,所以我想使用 GTK 按钮来避免弄乱鼠标坐标。当用户想要移动按钮所代表的图片或只是在时间轴上延长其延迟时,按钮小部件会发出信号,我的生活会轻松得多。
按钮当然不会显示在时间线上。那是我的问题。我知道我必须将按钮放在容器内,但如何在绘图功能中做到这一点?有没有人知道如何做到这一点?我用谷歌搜索并查看了这里,但没有运气。
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,12);
img_timeline_draw_time_ticks(da,cr,width);
//Video timeline
cairo_translate (cr,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,10,width - 2,59);
cairo_fill(cr);
//separator
cairo_set_source_rgb(cr,1,69,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,72,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","audio_background",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() !