当我单击一个小部件时,如何取消GTK中所有其他小部件的焦点? [英] How do I unfocus all other widgets in GTK when I click on a widget?

查看:41
本文介绍了当我单击一个小部件时,如何取消GTK中所有其他小部件的焦点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的GTK程序中,我有一个TextEntry小部件和一个TreeView小部件。当我单击TextEntry小部件并选择一些文本,然后单击TreeView小部件时,它没有取消选择TextEntry小部件中的文本。如何让它在我单击TreeView构件时取消选择TextEntry构件中的文本?

推荐答案

可以将gtk_editable_select_region绑定到条目的"focus-out-event"信号,参见下面的示例:

#include <gtk/gtk.h>

gboolean unselect_on_focus_lost (GtkWidget *widget)
{
    gtk_editable_select_region (GTK_EDITABLE (widget), 0, 0);
    return FALSE;
}

int main (int argc, char *argv[])
{
    GtkWidget *window, *box, *entry, *button;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width (GTK_CONTAINER (window), 5);
    gtk_window_set_default_size (GTK_WINDOW (window), 400, 130);

    box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
    gtk_container_add (GTK_CONTAINER (window), box);

    entry = gtk_entry_new ();
    gtk_entry_set_placeholder_text (GTK_ENTRY (entry), "I will lose my selection when you click the button below");
    g_signal_connect (G_OBJECT (entry), "focus-out-event", G_CALLBACK (unselect_on_focus_lost), NULL);
    gtk_container_add (GTK_CONTAINER (box), entry);

    entry = gtk_entry_new ();
    gtk_entry_set_placeholder_text (GTK_ENTRY (entry), "I will NOT lose my selection when you click the button below");
    gtk_container_add (GTK_CONTAINER (box), entry);

    /* I used a button instead of a treeview to keep the code short */
    button = gtk_button_new_with_label("Click me");
    gtk_container_add (GTK_CONTAINER (box), button);
    gtk_widget_grab_focus (button);

    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show_all (window);
    gtk_main ();

    return 0;
}

这篇关于当我单击一个小部件时,如何取消GTK中所有其他小部件的焦点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆