Gtk Notebook 小部件添加新标签错误

Posted

技术标签:

【中文标题】Gtk Notebook 小部件添加新标签错误【英文标题】:Gtk Notebook widget adding new tabs error 【发布时间】:2014-07-19 15:37:35 【问题描述】:

我有这个newTab() 函数,它在第一次运行时创建了一个Notebook 小部件,应该为下一次迭代(调用)创建新页面。

它适用于第一次运行,即创建一个带有标记为“文档”的新选项卡的笔记本。但是在下一次调用时,它会创建一个选项卡,但不会创建 DrawingArea。我什至无法切换这些新标签。

我收到错误:Gtk-WARNING **: Can't set a parent on widget which has a parent

我的代码是:

void myclass:: newTab()

if(!checkFlag)

    drawpointer = new DrawingArea();
    drawArea = drawpointer->createArea();
    View = GTK_NOTEBOOK(gtk_notebook_new());
    gtk_notebook_set_tab_pos (View, GTK_POS_TOP);
    label = gtk_label_new ("Document");
    gtk_notebook_append_page (View, drawArea, label);
    gtk_box_pack_start(box, GTK_WIDGET(View), TRUE, TRUE, 0);
    gtk_box_reorder_child (box, GTK_WIDGET(View), 1);
    gtk_widget_show (GTK_WIDGET(View));
    checkFlag = true;
  
    label = gtk_label_new ("Document1");
    cPage = gtk_notebook_get_current_page (View);
    gtk_notebook_insert_page (View, drawArea, label, cPage + 1);
    gtk_notebook_next_page (GTK_NOTEBOOK (View));   
  

这是我的DrawingArea 课程

DrawingArea:: DrawingArea()



GtkWidget* DrawingArea::createArea()

drawingArea = gtk_drawing_area_new();
gtk_widget_show (drawingArea);
return drawingArea;

我认为这是调用已创建的同一个绘图区域小部件的问题。但我不知道我应该如何解决这个问题。

【问题讨论】:

【参考方案1】:

在获得 IRC 的帮助后,我推断每当第二次调用 newTab() 时,都会将相同的 drawingArea 小部件添加到导致错误的新选项卡中。

通过从 if 块中取出 drawpointer 来解决这个问题,如下所示:

void myclass:: newTab()

  drawpointer = new DrawingArea();
  drawArea = drawpointer->createArea();
if(!checkFlag)
  
  View = GTK_NOTEBOOK(gtk_notebook_new());
  gtk_notebook_set_tab_pos (View, GTK_POS_TOP);
//label = gtk_label_new ("Document");
//gtk_notebook_append_page (View, drawArea, label);
  gtk_box_pack_start(box, GTK_WIDGET(View), TRUE, TRUE, 0);
  gtk_box_reorder_child (box, GTK_WIDGET(View), 1);
  gtk_widget_show (GTK_WIDGET(View));
  checkFlag = true;

  label = gtk_label_new ("Document1");
  cPage = gtk_notebook_get_current_page (View);
  gtk_notebook_insert_page (View, drawArea, label, cPage + 1);
  gtk_notebook_next_page (GTK_NOTEBOOK (View));   

这导致每次调用newTab() 时都会创建一个新的绘图小部件。 我希望这对其他人也有帮助。

【讨论】:

以上是关于Gtk Notebook 小部件添加新标签错误的主要内容,如果未能解决你的问题,请参考以下文章

GTK:无限的惰性小部件列表

在 Gtk::DrawingArea 中添加和定位小部件

GTKmm - 无法将固定大小设置为 Gtk::Scale 小部件

Gtk3用另一个小部件替换子小部件

在 Gtk 中,是不是可以让小部件淡入淡出?

带有g_timeout_add服务的GTK3并不总是更新GTK小部件