我才刚刚开始学习GTK3,但是我确实在挣扎。我可以找到的所有文档都是关于GTK2的,而gnome dev网站根本不够好。
现在,我试图从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不会自动将控件绑定到变量。您必须明确地在需要访问的所有控件(包括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 *

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

祝好运!

10-07 14:14
查看更多