繁体   English   中英

我希望获得有关gtk编程标准的帮助。 我该怎么办?

[英]I would like some help getting criteria of gtk programming. What could I do about this?

有人可以帮我吗? 我具有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()或上述方法的任何有效混合物将数据直接绑定到窗口小部件。

附录

使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM