我是C的新手,我正在尝试使用GTK构建一个Web浏览器,但我无法找到工作标签! 我认为这是相关的代码:
#include<gtk/gtk.h>
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *scrollable_window;
GtkWidget *new_tab_button;
GtkWidget *tab_label;
GtkWidget *notebook;
void new_tab() {
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrollable_window, tab_label);
}
int main(int argc, char** argv) {
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(GTK_WIDGET(window), 1300, 768);
tab_label = gtk_label_new ("tab");
scrollable_window = gtk_scrolled_window_new(NULL,NULL);
vbox = gtk_vbox_new(false,false);
hbox = gtk_hbox_new(false,false);
hbox_web_view = gtk_hbox_new(true,0);
notebook = gtk_notebook_new ();
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
gtk_widget_show(notebook);
gtk_container_add(GTK_CONTAINER(window), scrollable_window);
gtk_container_add(GTK_CONTAINER(scrollable_window), vbox);
gtk_container_add(GTK_CONTAINER(vbox), hbox);
gtk_container_add(GTK_CONTAINER(vbox), hbox_web_view);
new_tab_button = gtk_button_new_with_label("New tab");
g_signal_connect(new_tab_button, "clicked", G_CALLBACK(new_tab), web);
gtk_widget_show_all(window);
gtk_main();
return 0;
一切正常,但打开程序时没有笔记本显示。有一个“新标签”按钮,但每当我点击它关闭程序!
我想我只是不太明白gtk笔记本是如何工作的。任何人都可以帮我吗?
您的代码表明您只是在调用函数而没有推理为什么要调用每个函数。
gtk_container_add()
将窗口小部件添加到另一个可以是容器的窗口小部件,即可以包含其他窗口小部件的窗口小部件,例如,一个GtkBox
或GtkWindow
本身。
您正在正确创建笔记本,但不要将其添加到具有window
作为其自然根的窗口小部件层次结构中的任何容器。
此外,你创建一个scrollable_window
只有一次,但在现实生活中 - 除非你的设计是优化内存,你知道你在做什么 - 你需要多个scrollable_window
实例,实际上你需要一个网页视图和你添加的所有孩子你的代码到window
容器。
拥有scrollable_window
的多个实例意味着你应该在你的new_tab()
回调中创建每个实例,BTW有一个错误的签名,我不知道哪个是正确的签名但是肯定不是那个。
通常GTK会给你
gboolean
来指示你的回调是否处理了这个事件。理想情况下,
window
容器中,它应该是您的根小部件。new_tab()
回调中创建一个“浏览器”,并将其添加到您的笔记本中。使用第一个主要确定类型为GtkWidget
的参数,它是指向笔记本的指针,因此不需要它是全局的,不要使用全局变量。gpointer data
(可能是回调的最后一个参数)来存储您需要与main()
函数共享的任何上下文数据。
实现独立性并完全避免全局变量的理想方法是创建一个存储应用程序状态的结构,虽然现代Gtk +有这样的机制,但是将数据存储到某个地方并将其传递给最后一个回调仍然是一个好主意。参数到g_signal_connect()
并将其作为回调的最后一个参数接收。