gpt4 book ai didi

c - 从C中的GTK3 ComboBox中获取选定的文本

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

我才刚刚开始学习 GTK3,但我确实遇到了困难。我能找到的所有文档都是针对 GTK2 的,而 gnome 开发网站根本不够好。现在我试图从 GtkComboBox 获取选定的文本/项目,这是我尝试过的一些代码。

  gint array =gtk_combo_box_get_active(cbox_quaity);
//or
gchar *array =gtk_combo_box_get_active(cbox_quaity);

如果我使用 gint,无论我选择列表中的哪个项,打印输出都将为“0”(零)。如果我使用 gchar,我会返回“(null)”。此外,我在编译时收到这些警告。

gcc -c -g -O0 -Wall -pthread -pipe src/main.c `pkg-config --cflags --libs gtk+-3.0` -o main.o
src/main.c: In function ‘btn_start_click’:
src/main.c:41:17: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
gchar *array =gtk_combo_box_get_active(cbox_quaity);
^~~~~~~~~~~~~~~~~~~~~~~~
gcc -o tstreamer-gtk main.o -pthread `pkg-config --cflags --libs gtk+-3.0` -export-dynamic

用户界面是在glade中创建的,组合框使用了GtkListStore。另外,这里是 C 代码的源代码:

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

GtkWidget *btn_start;
GtkComboBox *cbox_quaity;
#define MAX_WORD_SIZE 32

void btn_start_click(){

gint active_item = gtk_combo_box_get_active(cbox_quaity);
printf("%d\n",active_item);
}

int main(int argc, char *argv[]){

GtkBuilder *builder;
GtkWidget *window;

gtk_init(&argc, &argv);

builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "glade/window_main.glade", NULL);

window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
gtk_builder_connect_signals(builder, NULL);

btn_start = GTK_WIDGET(gtk_builder_get_object(builder, "btn_start"));

g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}

// called when window is closed
void on_window_main_destroy(){
gtk_main_quit();
}

最佳答案

你做错了一些事情。

首先,GtkBuilder 不会自动将控件绑定(bind)到变量。您明确必须调用 gtk_builder_get_object()您需要访问的所有控件,包括 cbox_quaity .

现在,您不能仅根据示例进行编程;您需要文档来了解您可以做什么以及如何做。如果您检查文档,您会看到 gtk_combo_box_get_active() 返回 gint与所选项目的索引,因此 gint array步骤是对的。您不断从该函数中获取 0 的原因是因为如上所述,您忘记初始化 cbox_quaity ,所以它正在做 gtk_combo_box_get_active(NULL) ,这当然没有意义。

(由于动态链接的工作原理,GtkBuilder 可以自动按名称连接信号,但这是一个不同的讨论。)

您的信号方法签名也是错误的。您需要具有与您正在连接的信号相同的签名,您可以从文档中获得该签名。在你的情况下,btn_start_click()需要匹配 GtkButton::clicked 的信号和on_window_main_destroy()需要匹配 GtkWidget::destroy 的信号。每个信号函数都以一个参数开始,该参数是相关的小部件,每个信号函数以一个参数结束,该参数允许您传递您选择的数据,作为使用全局变量的更面向 future 的替代方案。对于 GtkBuilder 信号,这是 gtk_builder_connect_signals() 的第二个参数。 。也要注意你的返回值;如果信号返回一个值,那么该返回值很重要!

所有 GTK+ 类型都有类似 GTK_WIDGET() 的宏(您曾经使用过)和 GTK_COMBO_BOX()允许 GTK+ 小部件类型之间进行运行时类型检查的转换;这允许 GTK+ 小部件在 C 中具有多态性。因此,大多数 GTK+ 代码返回并存储 GtkWidget *直接。

最后,文档并不缺乏示例。不仅有full introductory section in the documentation proper ,其中包括a detailed tutorial除了较小的示例之外,GTK+ 中还包含一个名为 gtk3-demo 的程序。它提供了很多示例应用程序以及这些应用程序的源代码。 (某些 Linux 发行版可能会将此程序和一些相关程序拆分到一个名为 gtk3-examples 之类的单独包中。)

祝你好运!

关于c - 从C中的GTK3 ComboBox中获取选定的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41111656/

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