gpt4 book ai didi

c - 如何在 gtk 中刷新、重绘窗口(小部件)?

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:47 24 4
gpt4 key购买 nike

我使用的是 Opensuse 13.1 Linux 操作系统。我是 gtk2 和 c 的新手。我正在尝试创建一个应用程序,该应用程序可以在根据用户键入的值附加的表上放置一个按钮。我的程序代码如下

#include <stdlib.h>
#include <gtk/gtk.h>

typedef struct {
GtkWidget *value1, *value2, *value3, *value4;
} entrygrouped;

guint ival1, ival2, ival3, ival4;

void button_clicked(entrygrouped *widget)
{
const gchar *value1, *value2, *value3, *value4;

value1 = gtk_entry_get_text (GTK_ENTRY(widget->value1));
value2 = gtk_entry_get_text (GTK_ENTRY(widget->value2));
value3 = gtk_entry_get_text (GTK_ENTRY(widget->value3));
value4 = gtk_entry_get_text (GTK_ENTRY(widget->value4));

ival1 = (guint)atoi(value1);
ival2 = (guint)atoi(value2);
ival3 = (guint)atoi(value3);
ival4 = (guint)atoi(value4);

g_print("ENTRY VALUES = %s %s %s %s\n", value1, value2, value3, value4);
g_print("ENTRY NUMS = %d %d %d %d\n", ival1, ival2, ival3, ival4);
}

int main (int argc, char *args[])
{
GtkWidget *window, *vbox, *uptable, *downtable, *label;
GtkWidget *button, *button2;
gtk_init(&argc, &args);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_get_resizable(GTK_WINDOW(window));

entrygrouped *eg;
eg = g_slice_new(entrygrouped);

vbox = gtk_vbox_new(FALSE, 2);
uptable = gtk_table_new (3, 4, FALSE);
downtable = gtk_table_new (3, 3, TRUE);

label = gtk_label_new (" Enter the values to position the widget ");
eg->value1 = gtk_entry_new();
eg->value2 = gtk_entry_new();
eg->value3 = gtk_entry_new();
eg->value4 = gtk_entry_new();
button = gtk_button_new_with_label ("Submit");
button2 = gtk_button_new_with_label("BUTTON");

gtk_table_attach_defaults (GTK_TABLE(uptable), label, 0, 3, 0, 1);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value1, 0, 1, 1, 2);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value2, 1, 2, 1, 2);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value3, 0, 1, 2, 3);
gtk_table_attach_defaults (GTK_TABLE(uptable), eg->value4, 1, 2, 2, 3);
gtk_table_attach_defaults (GTK_TABLE(uptable), button, 1, 2, 3, 4);

gtk_widget_queue_draw(GTK_WIDGET(window));

gtk_table_attach_defaults (GTK_TABLE(downtable), button2, ival1, ival2,
ival3, ival4);

gtk_box_pack_start(GTK_BOX(vbox), uptable, 0, 0, 0);
gtk_box_pack_start(GTK_BOX(vbox), downtable, 0, 0, 0);


g_signal_connect_swapped(G_OBJECT(button), "clicked",
G_CALLBACK(button_clicked), eg);

g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_container_add (GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);

gtk_main();
return 0;
}

现在,每当我从终端打开我的应用程序并输入一些值并点击提交按钮时,值就会打印在终端上,但问题是窗口没有用新分配的值绘制按钮 2。我不知道有什么函数可以刷新或重绘整个窗口,尽管我试过了

while (gtk_events_pending())
gtk_main_iteration();

在 button2 表格附件上方,我的窗口什么也不做。我需要另一个回调函数来调整窗口大小吗?请帮我解决这个问题。

编辑: 如果我的问题不清楚,我想以图形方式显示如下

 ----------------------------
| a.out _ [ ] x |
---------------------------- before entering the
| -------------------------- | values
|| | ||
| -------------------------- |
|| | ||
| -------------------------- |
| ________ |
| | Submit ||
| -------- |
----------------------------

----------------------------
| a.out _ [ ] x |
---------------------------- after entering the
| -------------------------- | values
|| 0 | 1 ||
| -------------------------- | button2 widget should be
|| 0 | 1 || redrawn according to the
| -------------------------- | values entered and window
| ________ | widget should be updated
| | Submit ||
| -------- |
| _________ |
| | Button | |
| --------- |
----------------------------

最佳答案

您从未更改过 button2 的标签。

你应该有一些回调调用 gtk_button_set_labelbutton2 上;如果您想调整小部件的大小,您可能需要发送 size-request信号和/或 size-allocate和/或 check-resize容器上的信号。另见 this线程。

顺便说一句,你真的应该使用 GTK3在新代码中(因为 GTK3 在 w.r.t. GTK2 上改进了很多小部件布局)。你最好先编写一些更简单的代码,以理解 event loop的GTK。您需要使用 gdb debugger (valgrind 也应该有用)。

不要忘记在编译时启用所有警告和调试信息(使用例如 gcc -Wall -Wextra -Wstring-prototypes -g)

如您所料,您需要更多 callbacks (以及 signals 和插槽)函数。了解什么continuations是什么CPS应该有用(因为回调与延续相关)。

关于c - 如何在 gtk 中刷新、重绘窗口(小部件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32308231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com