刷新容器中的子项 - GTK [英] Refresh child-items in a container - GTK

查看:142
本文介绍了刷新容器中的子项 - GTK的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用图形用户界面开发某种金融计算器。我正在使用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\\\
,text);


$ b 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),金融计算器);
g_signal_connect(window,destroy,G_CALLBACK(gtk_main_quit),NULL);
g_signal_connect_swapped(窗口,delete-event,G_CALLBACK(gtk_widget_destroy),窗口);


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(股票价格,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();

$ b $ / code>


解决方案

preedit-changed和/或改变和/或 激活信号。然后通过 gtk_label_set_text(yourlabel,gtk_entry_get_text(yourentry)); 设置您的标签文本,如果您想直接复制/粘贴它。



注意:
$ b $ 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 以获取详细信息。


I am developing some kind of financial calculator in c with a graphical userinterface. I am using the gtk-lib and I have encountered one problem that right that could not be solved. Its about how to dynamically update (refresh) the window and its childs - more specifically - there is one child item in the container that is a text-label. I want this label to be changed according to what is entered in the textinputfield.

I am used to java where one easily can call a method named invalidate(). Is there a similar solution in c? Or is a solution to delete this chidlitem and and add a new one?

Thanks in advance

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

 }

解决方案

Hook up a callbacke to the "preedit-changed" and/or "changed" and/or "activate" signal(s). Then set your label's text in the callback via gtk_label_set_text (yourlabel, gtk_entry_get_text (yourentry)); if you want to copy/paste it directly.

Note:

gtk_entry_get_text (yourentry) gives you a pointer to internal storage, so DO NOT modify it directly, use g_strdup and operate on a copy. In the above it is ok (afaik) as gtk_label_set_text will copy the text anyways. (Also don't forget to free your stuff you alocated.)

See https://developer.gnome.org/gtk3/3.4/GtkEntry.html and https://developer.gnome.org/gtk3/3.4/GtkLabel.html for details.

这篇关于刷新容器中的子项 - GTK的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆