如何在普通C中访问动态创建的GTK Checkbutton

如何解决如何在普通C中访问动态创建的GTK Checkbutton

我创建了一个程序,该程序基于检查按钮输出CSV格式的标签。其中有很多标签,因此仅以编程方式创建它们是有意义的。.在这种意义上,我很成功,但我始终无法弄清楚如何由于您无法像普通的检查按钮一样访问它们,因此获得了它们的检查状态。我已经解决了这个问题,但是现在进入程序的“抛光”阶段,我真的很希望能够通过取消选中所有表单来重置表单,而且我不知道如何访问它们。这是动态创建复选按钮的方式:

        for (int x = 0; x <= NUMBER_OF_STRING; x++)
        {
            if (tagArray[x] != NULL && strcmp(tagArray[x],"\0"))
            {
                dynamic_checkBox = gtk_check_button_new_with_label(tagArray[x]);
                gtk_container_add(GTK_CONTAINER(flowBox),dynamic_checkBox);
                g_signal_connect(dynamic_checkBox,"toggled",G_CALLBACK(check_state),(gpointer)tagArray[x]);
            }
        }

这样就可以了。.我能够使用一点点“ hack”来创建一个额外的char数组,并在其中放置“ true”或“ false”字符串,然后使用strcmp()基本上编写自己的选中/未选中声明带有gpointer数据的数组,但是与大多数黑客一样,如果您没有正确执行操作,它将返回以获取ya ..现在我不知道如何取消选中所有复选框并重置表单。

static void uncheck_button_clicked(GtkWidget* widget,gpointer data)
{
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dynamic_checkBox),FALSE);
}

如您所见,我正在调用全局GtkWidget * dynamic_checkBox,但这对我没有帮助,因为它没有指向我所需的该复选框的实际实例。所以我该如何访问这些复选框?我什至尝试动态地用字符串声明新的GtkWidgets,以便可以访问它们,但这只会导致不兼容的类型错误...我一直在谷歌搜索并且将头撞在墙上两天了,但是没有结果。预先感谢。

解决方法

首先,使用全局GtkWidget*GtkCheckButton*毫无意义,因为无论如何您都有多个,因此每次创建一个新的时,它将覆盖旧值。

接下来,还有两种方法可以访问这些按钮:

  • 就像亚历山大在评论中建议的那样,您可以保留GtkWidget*GtkCheckButton*的列表(并在旅途中创建按钮时添加它们)。这样,您可以遍历数组并取消选中它们。

  • 另一种选择是通过遍历其所有子项来使用所有复选按钮的父容器(但这实际上是假设您那里没有任何其他GtkCheckButtons!)

GList *children = gtk_container_get_children (GTK_CONTAINER (flowbox));
for (GList *l = children; l; m = g_list_next (l)) {
    GtkWidget *child = l->data;

    // Note,you don't need this if-check if your flowbox only contains checkbuttons.
    // Bote 2: this *will* turn off also unrelated check buttons
    if (GTK_IS_CHECK_BUTTON (child)) {
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (child),FALSE);
    }
}

作为旁注:如果只想检查字符串是否为空,则可以使用strcmp(tagArray[x],"")

,

已解决:谢谢大家的答复。每个人的贡献都得到了帮助和进行了研究,但这是亚历山大的评论和所选择的答案的结合,这才对我有所帮助。我不认为列表存在于C. Only数组中。.很高兴GTK提供了一个GList。

无论如何..经过长时间的哭和咬牙扎根(这实际上是我学习低级C的第五天,我是C#的人),我能够修改提供的答案以适合我的解决方案。

第1步:将复选按钮添加到列表中,以便以后可以检索它们。仅将一行添加到现有代码中:

for (int x = 0; x <= NUMBER_OF_STRING; x++)
{
    if (tagArray[x] != NULL && strcmp(tagArray[x],"\0"))
    {
        dynamic_checkBox = gtk_check_button_new_with_label(tagArray[x]);
        gtk_container_add(GTK_CONTAINER(flowBox),dynamic_checkBox);
        g_signal_connect(dynamic_checkBox,"toggled" G_CALLBACK(check_state),(gpointer)tagArray[x]);
        checkButtonList = g_list_insert(checkButtonList,dynamic_checkBox,-1);
    }
}

第2步:遍历检查按钮列表,然后取消选中每个按钮:

static void uncheck_button_clicked(GtkCheckButton* checkButton,gpointer data)
{

     for (GList *l = checkButtonList; l != NULL; l = l->next)
    {
        GtkWidget *child = l->data;
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(child),FALSE);
    }
    
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?