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

问题描述 投票:0回答:4

我才刚刚开始学习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();
}
c combobox gtk gtk3
4个回答
1
投票

你做错了一些事情。

首先,GtkBuilder 不会自动将控件绑定到变量。您明确必须在需要访问的所有控件上调用

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
的信号。每个信号函数都以一个参数开始,该参数是相关的小部件,每个信号函数以一个参数结束,该参数允许您传递您选择的数据,作为使用全局变量的更面向未来的替代方案。对于 GtkBuilder 信号,这是
gtk_builder_connect_signals()
的第二个参数。也要注意你的返回值;如果信号返回一个值,那么该返回值很重要!

所有 GTK+ 类型都有像

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

最后,文档并不缺乏示例。文档中不仅有完整的介绍性部分,其中包括详细教程以及较小的示例,GTK+ 中还包含一个名为

gtk3-demo
的程序,它提供了很多示例应用程序并且这些应用程序的源代码。 (某些 Linux 发行版可能会将此程序和一些相关程序拆分为一个名为
gtk3-examples
之类的单独包。)

祝你好运!


0
投票

这是“正确的做法”™:

gint active_item = gtk_combo_box_get_active(cbox_quaity);

是的,您必须使用 int,而不是指向 int 的指针,如 gtk_combo_box_get_active 的文档中所述。

如果这不起作用,这是因为您没有在正确的时间或地点调用它,因此我们需要更多的上下文来确定问题。


0
投票

我是这样解决的:

GtkTreeIter   iter;
GtkTreeModel* model;
gchar*        value;

1.- I get model of combobox
    model = gtk_combo_box_get_model(GTK_COMBO_BOX(combobox));

2.- I get the iter selected in the model
    gtk_tree_model_get(model, &iter, 1, &value,  -1);

3.- in value is written the active text

Greetings !
Note:
combobox is gtk_combo_box

0
投票

这就是我想要的

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

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

void btn_start_click(GtkWidget *widget, gpointer builder){
  cbox_quaity=GTK_COMBO_BOX(gtk_builder_get_object(builder, "ID of combobox"));
  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);

  /* Add a signal to the button to call your function and pass in the builder */
  btn_start = gtk_builder_get_object(builder, "btn_start");
  g_signal_connect(btn_start,"clicked",G_CALLBACK (btn_start_click),builder);

  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();
}
© www.soinside.com 2019 - 2024. All rights reserved.