如何使用GTK笔记本在我的浏览器中添加标签?

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

我是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笔记本是如何工作的。任何人都可以帮我吗?

c webkit gtk
1个回答
0
投票

您的代码表明您只是在调用函数而没有推理为什么要调用每个函数。

gtk_container_add()将窗口小部件添加到另一个可以是容器的窗口小部件,即可以包含其他窗口小部件的窗口小部件,例如,一个GtkBoxGtkWindow本身。

您正在正确创建笔记本,但不要将其添加到具有window作为其自然根的窗口小部件层次结构中的任何容器。

此外,你创建一个scrollable_window只有一次,但在现实生活中 - 除非你的设计是优化内存,你知道你在做什么 - 你需要多个scrollable_window实例,实际上你需要一个网页视图和你添加的所有孩子你的代码到window容器。

拥有scrollable_window的多个实例意味着你应该在你的new_tab()回调中创建每个实例,BTW有一个错误的签名,我不知道哪个是正确的签名但是肯定不是那个。

通常GTK会给你

  • 生成信号的对象作为回调的第一个参数。
  • 指向您自己的数据的指针,您可以使用它来避免全局变量并使代码更加健壮和可重用。
  • 有一些回调具有额外的参数,您只需要查看信号的文档以确定哪个是正确的签名。
  • 一些回调(如果不是全部,我不记得了)返回一个gboolean来指示你的回调是否处理了这个事件。

理想情况下,

  1. 创建笔记本。
  2. 将笔记本直接添加到window容器中,它应该是您的根小部件。
  3. new_tab()回调中创建一个“浏览器”,并将其添加到您的笔记本中。使用第一个主要确定类型为GtkWidget的参数,它是指向笔记本的指针,因此不需要它是全局的,不要使用全局变量。
  4. 使用gpointer data(可能是回调的最后一个参数)来存储您需要与main()函数共享的任何上下文数据。 实现独立性并完全避免全局变量的理想方法是创建一个存储应用程序状态的结构,虽然现代Gtk +有这样的机制,但是将数据存储到某个地方并将其传递给最后一个回调仍然是一个好主意。参数到g_signal_connect()并将其作为回调的最后一个参数接收。
© www.soinside.com 2019 - 2024. All rights reserved.