我正在使用图形用户界面在c中开发某种金融计算器。我使用的是gtk-lib,我遇到了一个无法解决的问题。它关于如何动态更新(刷新)窗口及其子窗口 - 更具体地说 - 容器中有一个子项是文本标签。我希望根据textinputfield中输入的内容更改此标签。
我习惯于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 ();
}
答案 0 :(得分:2)
将回拨发送到"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.html和https://developer.gnome.org/gtk3/3.4/GtkLabel.html。
答案 1 :(得分:2)
GtkEntry
小部件实现GtkEditable
,因此它继承了它的属性和信号。这反过来意味着您可以通过将回调连接到"changed"
信号来了解其内容何时发生变化。