2014-01-03 5 views
0

Я разрабатываю какой-то финансовый калькулятор в c с графическим интерфейсом пользователя. Я использую gtk-lib, и я столкнулся с одной проблемой, которая не может быть решена. О том, как динамически обновлять (обновлять) окно и его дочерние элементы - точнее - в контейнере есть один дочерний элемент, который является текстовой меткой. Я хочу, чтобы этот ярлык был изменен в соответствии с тем, что введено в поле textinput.Обновите дочерние элементы в контейнере - GTK

Я привык к java, где можно легко вызвать метод с именем invalidate(). Есть ли аналогичное решение в c? Или это решение для удаления этого chidlitem и добавления нового?

Заранее спасибо enter image description here

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

} 

ответ

2

подключить callbacke к "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.

+0

Спасибо !!! Я займусь этим. :) – user2991252

2

Виджет GtkEntry реализует GtkEditable, поэтому он наследует его свойства и сигналы. Это, в свою очередь, означает, что вы можете знать, когда изменяется его контент, подключив обратный вызов к сигналу "changed".

Смежные вопросы