gpt4 book ai didi

c - 我需要一些帮助来获取 gtk 编程的标准。对此我能做什么呢?

转载 作者:行者123 更新时间:2023-11-30 17:30:49 24 4
gpt4 key购买 nike

有人可以帮助我吗?我有 C 语言编程技能,我正在尝试使用 gtk 来编写 gui 程序。我希望,通过从小部件(例如按钮)触发操作(回调函数),我可以更改属于任何其他小部件的任何条件或特征。即允许从回调函数内完全可见,就好像所有 gui 小部件(例如单个主应用程序窗口)中的所有变量都是全局的。我怎样才能找到最接近的方法来实现这一目标?到目前为止,当我尝试制作比简单的 Hello World 教程更复杂的东西时,我尝试发现使用 gtk 编程的基本概念的步骤让我感到沮丧。我还尝试使用:

/* out of main */
struct data_widgets
{
struct data_widgets * myp;
gchar **loc ; // LOCAL name
gchar **rem ; // REMOTE name
gchar **pmte ; // Plain message to encrypt filename
gchar **lem ; // Local encrypted message filename
gchar **emr ; // Encrypted message received filename
gchar **pmr ; // Plain message received filename
gchar **lopk ; // Local owner public key filename
gchar **crpk ; // Current remote public key filename
};

int main(int argc, char *argv[])
{
gchar loc_str[100] = "*"; /* LOCAL name for filechoose filter */
gchar rem_str[100] = "*"; /* REMOTE name idem */
gchar pmte_str[100]= "plainmsgtoencrypt"; /* Plain message to encrypt filename */
gchar lem_str[100] = "localencmsg"; /* Local encrypted message filename */
gchar emr_str[100] = "encmsgreceiv"; /* Encrypted message received filename */
gchar pmr_str[100] = "plainreceiv"; /* Plain message received filename */
gchar lopk_str[100]= "locownpubkey"; /* Local owner public key filename */
gchar crpk_str[100]= "remotpubkey"; /* Current remote public key filename */

struct data_widgets mydata;

mydata.loc = &loc_str;
mydata.rem = &rem_str;
mydata.pmte = &pmte_str;
mydata.lem = &lem_str;
mydata.emr = &emr_str;
mydata.pmr = &pmr_str;
mydata.lopk = &lopk_str;
mydata.crpk = &crpk_str;
mydata.myp = &mydata;
/* in main */
....
/* in my callback */
struct data_widgets *pp = (struct data_widgets *) data;

/*passing gpointer data as &mydata.myp, and doing (*pp)->(any pointer) this try fail*/

最佳答案

据我了解,您希望从回调中访问小部件,而不必携带一堆全局变量。你有一些选择。

您可以将数据和小部件打包到单个结构中,并将其作为 user_data 传递给回调。

struct snapshot {
struct data_widgets data;
GtkWidget *entry;
GtkWidget *box;
GtkWidget *label;
GtkWidget *whatever;
};
/* Now fill and use the above struct as user_data */

GtkWidget 字段应该在您用来创建 UI 内容的代码中初始化。

您还可以使用gtk_widget_set_name()为每个相关小部件设置名称。 ( Glade 自动为每个元素设置名称)。一旦您需要一个小部件,只需使用 gtk_widget_get_name() 即可获取它.

static void a_callback(GtkWidget *widget, gpointer user_data)
GtkWidget *an_entry = NULL;
GtkWidget *toplevel = gtk_widget_get_toplevel(widget);
if (gtk_widget_is_toplevel(toplevel))
an_entry = gtk_widget_get_name(toplevel, "name of the entry");
g_return_if_fail(an_entry != NULL);
/* ... do something with an_entry ... */
}

您还可以像 DOM 一样遍历小部件层次结构,或者使用 g_object_set_data() 将数据直接绑定(bind)到小部件。或上述内容的任何有效组合。

附录

使用g_object_set_data(),您可以将任意数据附加到任何GObject实例,例如:

gchar *text;

/* Bind some data to widget */
g_object_set_data(G_OBJECT(widget), "pmte", "plainmsgtoencrypt");
g_object_set_data(G_OBJECT(widget), "lem", "localencmsg");

text = g_object_get_data(G_OBJECT(widget), "pmte");
g_print("%s\n", text); /* Print "plainmsgtoencrypt" */
g_free(text);

text = g_object_get_data(G_OBJECT(widget), "lme");
g_print("%s\n", text); /* Print "localencmsg" */
g_free(text);

代码清理

你的代码在很多方面都很困惑:我建议你忘记你学过的 C 语言并从零开始。您的数据比所需的多了一级间接,myp 是假的,您正在指定数组的大小并初始化它。

回答您的评论:以下代码是独立的,不会引发您看到的错误。

#include <gtk/gtk.h>

struct data_widgets {
gchar **crpk;
};

void callback(GtkWidget *widget, gpointer user_data) {
struct data_widgets *data = user_data;
g_print("%s\n", data->crpk); /* Prints remotpubkey */
}

int main(int argc, char *argv[]) {
gchar crpk_str[100] = "remotpubkey";
struct data_widgets mydata;

mydata.crpk = &crpk_str;

callback(NULL, &mydata);
return 0;
}

相同的代码,以合理的方式清理:

#include <gtk/gtk.h>

typedef struct {
gchar *crpk;
} data_t;

void callback(GtkWidget *widget, gpointer user_data) {
data_t *data = user_data;
g_print("%s\n", data->crpk); /* Prints remotpubkey */
}

int main() {
data_t mydata;

mydata.crpk = "remotpubkey";

callback(NULL, &mydata);
return 0;
}

关于c - 我需要一些帮助来获取 gtk 编程的标准。对此我能做什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24921800/

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