c - 如何使用 GTK Notebook 向浏览器添加选项卡?

标签 c webkit gtk

我是 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() 将一个小部件添加到另一个可以是容器的小部件,即可以包含其他小部件,例如GtkBoxGtkWindow 本身。

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

此外,您只能创建一个 scrollable_window 一次,但在现实生活中 - 除非您的设计正在优化内存并且您知道自己在做什么 - 您需要多个 scrollable_window 实例,事实上,您需要一个 Web View 以及在代码中添加到 window 容器中的所有 subview 。

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

通常 GTK 会给你

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

理想情况下,

  1. 创建笔记本。

  2. 将笔记本直接添加到 window 容器中,它应该是您的根小部件。

  3. new_tab() 回调中创建一个“浏览器”,并将其添加到您的笔记本中。使用第一个参数,该参数基本上是 GtkWidget 类型,并且是指向笔记本的指针,因此不需要它是全局的,永远不要使用全局变量。

  4. 使用 gpointer 数据(可能是回调的最后一个参数)来存储您需要与 main( 共享的任何上下文数据) ) 函数。

    实现独立性并完全避免全局变量的理想方法是创建一个结构来存储应用程序状态,尽管现代 Gtk+ 有这方面的机制,但将数据存储在某处并将其传递给回调仍然是一个好主意通过 g_signal_connect() 的最后一个参数并将其作为回调的最后一个参数接收。

关于c - 如何使用 GTK Notebook 向浏览器添加选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49095474/

相关文章:

c - 是否有与C相同的语言?

gtk - 如何在开罗表面上绘制任何 GTK 小部件

compiler-errors - 在代码:Blocks (WIndows 10 )中安装GTK时出现问题

c - 使用 Cairo 图形绘制多个矩形

c++ - GCC 可以从最终输出中消除什么样的死代码?

c - 引用函数不编译

C ,关于指针(或指向指针的指针?)、** 和 malloc

Android 浏览器缩放?

javascript - HTML5 拖放 - 不适用于 iOS 12.1.2(Safari 和 Chrome)

javascript - typescript 中的 window.webkit