刷新容器中的子项 – GTK

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

我习惯于java,其中一个可以轻松调用名为invalidate()的方法。 c中有类似的解决方案吗? 或者是删除这个chidlitem并添加一个新的解决方案?

提前致谢 在此处输入图像描述

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

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

将回调连接到"preedit-changed"和/或"changed"和/或"activate"信号。 然后通过gtk_label_set_text (yourlabel, gtk_entry_get_text (yourentry));在回调中设置标签的文本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.html和https://developer.gnome.org/gtk3/3.4/GtkLabel.html 。