【问题标题】:GtkButton label updatesGtkButton 标签更新
【发布时间】:2021-06-02 19:15:42
【问题描述】:

我正在使用 C、Glade 和 Gtk 设计一个 GUI。

我在 glade 中配置了一些信号来更新各种小部件的标签,主要是 GtkButton 和 GtkLabel。整体功能是,当单击某个单选按钮时,所有按钮和标签都会响应更改(语言选择)。

我在小部件 _draw() 函数中使用函数 gtk_label_set_label(...) 并且它按预期工作(文本更改,g_print 发生(一次))。

gboolean on_lblMyLabel_draw(GtkLabel *label, gpointer *user_data) {
    gtk_label_set_label(label, "custom text");
    g_print("%s\n", "custom text");
    return FALSE;
}

但是,当我通过按钮尝试相同的操作时,

gboolean on_btnMyButton_draw(GtkButton *button, gpointer *user_data) {
    gtk_button_set_label(button, "custom text");
    g_print("%s\n", "custom text");
    return FALSE;
}

文本不会更新,而是消失,并且 g_print() 语句会永远打印(就像 draw 递归调用自身一样)。

有趣的是,如果我将按钮代码从 _draw 移动到 _click,它会按预期工作,但是,我需要 GUI 重新绘制自身,因此在点击时更新是不切实际的。

  1. 有没有办法,使用 _draw() 来防止这种情况?
  2. 有没有更好的方法来做到这一点?

谢谢!

【问题讨论】:

    标签: user-interface gtk glade gtkbutton


    【解决方案1】:
    1. 有没有办法,使用 _draw() 来防止这种情况?

    不,您也不应该为此使用draw 信号。它有一个完全不同的目的,每次小部件重绘时都会调用它。这也是你的按钮进入无限递归的原因:你改变了它的标签,所以它认为它需要重绘;重绘会导致您的回调被调用,这会再次更改标签等

    1. 有没有更好的方法来做到这一点?

    是的,您自己已经提到过:确保您在适当的位置(例如,在单击事件中)执行更改小部件的逻辑,并让 GTK 小部件自行重绘。

    除非您正在做一些非常奇特的事情(例如不运行事件循环,您可以使用 GtkApplication 自动获得),否则这一切都可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-17
      • 2012-02-13
      • 2012-08-09
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多