我只是开始学习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();
}
答案 0 :(得分: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 *
。
最后,文档并非缺乏示例。不仅有full introductory section in the documentation proper,其中包含a detailed tutorial以及更小的示例,GTK +中还包含一个名为gtk3-demo
的程序,它提供 lot 示例应用程序和这些应用程序的源代码。 (某些Linux发行版可能会将此程序和一些相关程序拆分为一个名为gtk3-examples
的单独程序包。)
答案 1 :(得分:0)
这是“正确的方法”™:
gint active_item = gtk_combo_box_get_active(cbox_quaity);
是的,您必须使用int,而不是指向int的指针,如gtk_combo_box_get_active的文档中所述。
如果这不起作用,这是因为你没有在正确的时刻或地点调用它,因此我们需要更多的上下文来确定问题。
答案 2 :(得分: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 writed el active text
Greetings !
Note:
combobox is gtk_combo_box