Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C在短时间内显示GTK工具提示?_C_Tooltip_Gtk3 - Fatal编程技术网

如何使用C在短时间内显示GTK工具提示?

如何使用C在短时间内显示GTK工具提示?,c,tooltip,gtk3,C,Tooltip,Gtk3,我有一个应用程序,在其中,单击一个按钮,我想显示一个工具提示,然后在一段时间延迟后隐藏它。时间延迟是使用 这是我试过的 #include <gtk/gtk.h> #include <stdio.h> #include <time.h> // https://stackoverflow.com/a/3930477/6286575 void wait(int unsigned delay) { int unsigned end_time = time(0

我有一个应用程序,在其中,单击一个按钮,我想显示一个工具提示,然后在一段时间延迟后隐藏它。时间延迟是使用

这是我试过的

#include <gtk/gtk.h>
#include <stdio.h>
#include <time.h>

// https://stackoverflow.com/a/3930477/6286575
void wait(int unsigned delay)
{
    int unsigned end_time = time(0) + delay;
    while(time(0) < end_time);
}

void show_tooltip(GtkWidget *widget, gpointer data)
{
    GtkWidget **window = data;
    printf("Showing tooltip.\n");
    gtk_widget_set_tooltip_text(*window, "Clicked!");
    wait(5);
    // printf("Hiding tooltip.\n");
    // gtk_widget_set_has_tooltip(*window, FALSE);
}

int main(void)
{
    gtk_init(0, NULL);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    GtkWidget *grid = gtk_grid_new();
    gtk_container_add(GTK_CONTAINER(window), grid);

    GtkWidget *button = gtk_button_new_with_label("Click Me");
    gtk_grid_attach(GTK_GRID(grid), button, 0, 0, 1, 1);
    g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(show_tooltip), &window);

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

GUI是在mainloop中绘制的。当您调用
sleep()
时,您会将其冻结一段时间,但它什么也不做:没有重新绘制,没有用户输入的反馈等。您必须显示工具提示,并安排一个稍后将隐藏工具提示的函数

gboolean隐藏工具提示(gpointer数据)
{
GtkWidget*小部件=数据;
gtk_widget_set_有工具提示(widget,FALSE);
返回G_SOURCE_REMOVE;//与FALSE相同,否则将再次调用此函数;
}
无效显示工具提示(GtkWidget*小部件,gpointer数据)
{
GtkWidget**窗口=数据;
printf(“显示工具提示。\n”);
gtk_小部件_设置_工具提示_文本(*窗口,“单击!”);
//时间表
g_timeout_add(5*g_TIME_SPAN_毫秒,隐藏工具提示,*窗口);
}

图形用户界面在主循环中绘制。当您调用
sleep()
时,您会将其冻结一段时间,但它什么也不做:没有重新绘制,没有用户输入的反馈等。您必须显示工具提示,并安排一个稍后将隐藏工具提示的函数

gboolean隐藏工具提示(gpointer数据)
{
GtkWidget*小部件=数据;
gtk_widget_set_有工具提示(widget,FALSE);
返回G_SOURCE_REMOVE;//与FALSE相同,否则将再次调用此函数;
}
无效显示工具提示(GtkWidget*小部件,gpointer数据)
{
GtkWidget**窗口=数据;
printf(“显示工具提示。\n”);
gtk_小部件_设置_工具提示_文本(*窗口,“单击!”);
//时间表
g_timeout_add(5*g_TIME_SPAN_毫秒,隐藏工具提示,*窗口);
}
sudo apt install libgtk-3-dev
gcc $(pkg-config --libs --cflags gtk+-3.0) main.c
./a.out