【问题标题】:Refresh child-items in a container - GTK刷新容器中的子项 - GTK
【发布时间】:2014-01-21 05:11:51
【问题描述】:

我正在用 c 语言开发某种带有图形用户界面的金融计算器。我正在使用 gtk-lib,但遇到了一个无法解决的问题。它关于如何动态更新(刷新)窗口及其子项 - 更具体地说 - 容器中有一个子项是文本标签。我希望根据文本输入字段中输入的内容更改此标签。

我已经习惯了 java,其中可以很容易地调用一个名为 invalidate() 的方法。 c中是否有类似的解决方案?或者是删除这个chidlitem并添加一个新的解决方案?

提前感谢

      #include <gtk/gtk.h>

 static GtkWidget *txt;
 static GtkWidget *window;
 static GtkWidget *vbox, *assetPrice, *strikePrice;
 static GtkWidget *asset_label;
 static GtkWidget *frame;

 static void entry_Submit(GtkWidget *widget, GtkWidget *entry)
 {
  const gchar *text = gtk_entry_get_text(GTK_ENTRY (txt));
  printf ("Result: %s\n", text);

 }

 static void CreateTextBox(GtkWidget **entry, GtkWidget *vbox)
 {
    *entry = gtk_entry_new();
    gtk_entry_set_text (GTK_ENTRY (*entry), "");
    gtk_box_pack_start (GTK_BOX (vbox), *entry, TRUE, TRUE, 0);
 }
 int main(int argc, char *argv[] )
 {
    GtkWidget *button;
    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request (GTK_WIDGET (window), 300, 300);
    gtk_window_set_title (GTK_WINDOW (window), "FINANCIAL CALCULATOR");
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    g_signal_connect_swapped (window, "delete-event", G_CALLBACK (gtk_widget_destroy), window);


    vbox = gtk_vbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (window), vbox);
    gtk_widget_show (vbox);

    frame = gtk_frame_new ("ASSET PRICE");
    asset_label = gtk_label_new ("stock price, stockmarketindex ...");
    gtk_container_add (GTK_CONTAINER (frame), asset_label);
    gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);

    assetPrice = gtk_hbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (vbox), assetPrice);
    gtk_widget_show(assetPrice);

    frame = gtk_frame_new ("RESULT: ");
    asset_label = gtk_label_new ("... new value");
    gtk_container_add (GTK_CONTAINER (frame), asset_label);
    gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);

    CreateTextBox(&txt, assetPrice);

    button = gtk_button_new_with_label("Calculate");
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (entry_Submit), window);

    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
    gtk_widget_set_can_default (button, TRUE);
    gtk_widget_grab_default (button);

     gtk_widget_show_all (window);

     gtk_main ();

 }

【问题讨论】:

    标签: c gtk refresh gtk3


    【解决方案1】:

    将回调连接到"preedit-changed" 和/或"changed" 和/或"activate" 信号。如果您想直接复制/粘贴,请通过gtk_label_set_text (yourlabel, gtk_entry_get_text (yourentry)); 在回调中设置标签的文本。

    注意:

    gtk_entry_get_text (yourentry) 给你一个指向内部存储的指针,所以不要直接修改它,使用g_strdup 并对副本进行操作。在上面没关系(afaik),因为gtk_label_set_text 无论如何都会复制文本。 (也不要忘记释放你分配的东西。)

    详情请参阅https://developer.gnome.org/gtk3/3.4/GtkEntry.htmlhttps://developer.gnome.org/gtk3/3.4/GtkLabel.html

    【讨论】:

      【解决方案2】:

      GtkEntry 小部件实现了GtkEditable,因此它继承了它的属性和信号。这反过来意味着您可以通过将回调连接到 "changed" 信号来了解其内容何时发生变化。

      【讨论】:

        猜你喜欢
        • 2012-02-29
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多