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

问题描述 投票:0回答:1

我有一个应用程序,在其中单击按钮,我想显示一个工具提示,然后在一段时间后将其隐藏。时间延迟是使用https://stackoverflow.com/a/3930477/6286575实现的。

这是我尝试过的。

#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();
}

期望

工具提示应该在终端上显示Showing tooltip.之后立即显示。

观察

Showing tooltip.出现在终端上大约5秒钟后显示工具提示。

如何确保在打印Showing tooltip.的同时显示工具提示?在wait(5);延迟之后,我想隐藏工具提示,以便有效地使工具提示仅在短时间内可见。

要运行代码,需要GTK3。

sudo apt install libgtk-3-dev
gcc $(pkg-config --libs --cflags gtk+-3.0) main.c
./a.out
c tooltip gtk3
1个回答
0
投票

GUI在主循环中绘制。当您调用sleep()时,它冻结了一段时间,并且不执行任何操作:不重绘,不提供用户输入反馈等。您必须显示工具提示并安排一个以后将其隐藏的功能。

gboolean hide_tooltip (gpointer data)
{
    GtkWidget *widget = data;
    gtk_widget_set_has_tooltip (widget, FALSE);

    return G_SOURCE_REMOVE; // same as FALSE. otherwise this function will be called again;
}

void show_tooltip (GtkWidget *widget, gpointer data)
{
    GtkWidget **window = data;
    printf("Showing tooltip.\n");
    gtk_widget_set_tooltip_text(*window, "Clicked!");

    // Schedule 
    g_timeout_add (5 * G_TIME_SPAN_MILLISECOND, hide_tooltip, *window);
}
© www.soinside.com 2019 - 2024. All rights reserved.