从Gtkmm::表中删除一行 < >如何擦除 > gtkmm::表< /C> > C++ >?/P>

从Gtkmm::表中删除一行 < >如何擦除 > gtkmm::表< /C> > C++ >?/P>,c++,gtk,gtkmm,C++,Gtk,Gtkmm,文档真的很糟糕:-(.我尝试过使用resize(),但没有效果,还调用了Gtk::Widget&,我通过get_children()获得的Gtk::Widget&,但是如果Gtkmm::Table,那么I get segfault…可能应该做你需要的事情。我举了一个小例子(见下文)它从表容器中删除所有标签小部件 #include <gtk/gtk.h> void remove_widgets(GtkWidget *widget, gpointer data) { if (G

文档真的很糟糕:-(.我尝试过使用
resize()
,但没有效果,还调用了
Gtk::Widget&
,我通过
get_children()
获得的
Gtk::Widget&
,但是如果
Gtkmm::Table
,那么I get segfault…

可能应该做你需要的事情。我举了一个小例子(见下文)它从表容器中删除所有标签小部件

#include <gtk/gtk.h>

void remove_widgets(GtkWidget *widget, gpointer data)
{
    if (GTK_IS_LABEL(widget))
    {
        g_print("remove label\n");
        gtk_container_remove(GTK_CONTAINER(data), widget);
    }
}

void remove_rows(GtkWidget *button, GtkWidget* data)
{
    g_print("remove rows with labels\n");
    gtk_container_foreach(GTK_CONTAINER(data), remove_widgets, data);
}

int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *table;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_widget_set_size_request (window, 300, 250);
    gtk_window_set_resizable(GTK_WINDOW(window), FALSE);

    gtk_window_set_title(GTK_WINDOW(window), "Test Table Remove");

    gtk_container_set_border_width(GTK_CONTAINER(window), 15);

    table = gtk_table_new(3, 2, FALSE);
    gtk_table_set_col_spacings(GTK_TABLE(table), 3);

    GtkWidget *label0 = gtk_label_new("Test Label 0");
    gtk_table_attach(GTK_TABLE(table), label0, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
    GtkWidget *label1 = gtk_label_new("Test Label 1");
    gtk_table_attach(GTK_TABLE(table), label1, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);

    GtkWidget *label2 = gtk_label_new("Test Label 3");
    gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
    GtkWidget *label3 = gtk_label_new("Test Label 4");
    gtk_table_attach(GTK_TABLE(table), label3, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);

    GtkWidget *button0 = gtk_button_new_with_label("Remove Labels");
    gtk_widget_set_size_request(button0, 70, 30);
    gtk_table_attach(GTK_TABLE(table), button0, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);

    g_signal_connect(G_OBJECT(button0), "clicked", G_CALLBACK(remove_rows), table);

    gtk_container_add(GTK_CONTAINER(window), table);

    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
#包括
void remove_小部件(GtkWidget*小部件、gpointer数据)
{
if(GTK_是_标签(小部件))
{
g_打印(“移除标签”);
gtk_容器_移除(gtk_容器(数据),小部件);
}
}
无效删除_行(GtkWidget*按钮,GtkWidget*数据)
{
g_print(“删除带有标签的行\n”);
gtk_容器_foreach(gtk_容器(数据),删除_小部件,数据);
}
int main(int argc,char*argv[])
{
GtkWidget*窗口;
GtkWidget*表;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_小部件_设置_大小_请求(窗口,300250);
gtk_窗口设置可调整大小(gtk_窗口(窗口),错误);
gtk_窗口设置标题(gtk_窗口(窗口),“测试表移除”);
gtk_容器_设置_边框_宽度(gtk_容器(窗口),15);
表=gtk_表_新(3,2,假);
gtk_表设置列间距(gtk_表(表),3);
GtkWidget*label0=gtk_标签_新(“测试标签0”);
gtk_表附(gtk_表(表),标签0,0,1,0,1,gtk_填充,gtk_填充,0,0);
GtkWidget*label1=gtk_标签_新(“测试标签1”);
gtk_表附件(gtk_表(表),标签1,1,2,0,1,gtk_填充,gtk_填充,0,0);
GtkWidget*label2=gtk_标签_新(“测试标签3”);
gtk_表附(gtk_表(表),标签2,0,1,1,2,gtk_填充,gtk_填充,0,0);
GtkWidget*label3=gtk_标签_新(“测试标签4”);
gtk_表附(gtk_表(表),标签3,1,2,1,2,gtk_填充,gtk_填充,0,0);
GtkWidget*button0=gtk_按钮带_标签的新按钮(“移除标签”);
gtk小部件设置大小请求(按钮0、70、30);
gtk_表格附件(gtk_表格,按钮0,0,1,2,3,gtk_填充,gtk_填充,0,0);
g_信号连接(g_对象(按钮0),“单击”,g_回调(删除行),表格);
gtk_容器添加(gtk_容器(窗口),表格);
g_信号连接交换(g_对象(窗口),“销毁”,g_回调(gtk_主退出),g_对象(窗口));
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}

希望这对您有所帮助,如果
Gtkmm::Table
是,那么您可能需要做什么。我举了一个小例子(见下文),它将从表容器中删除所有标签小部件

#include <gtk/gtk.h>

void remove_widgets(GtkWidget *widget, gpointer data)
{
    if (GTK_IS_LABEL(widget))
    {
        g_print("remove label\n");
        gtk_container_remove(GTK_CONTAINER(data), widget);
    }
}

void remove_rows(GtkWidget *button, GtkWidget* data)
{
    g_print("remove rows with labels\n");
    gtk_container_foreach(GTK_CONTAINER(data), remove_widgets, data);
}

int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *table;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_widget_set_size_request (window, 300, 250);
    gtk_window_set_resizable(GTK_WINDOW(window), FALSE);

    gtk_window_set_title(GTK_WINDOW(window), "Test Table Remove");

    gtk_container_set_border_width(GTK_CONTAINER(window), 15);

    table = gtk_table_new(3, 2, FALSE);
    gtk_table_set_col_spacings(GTK_TABLE(table), 3);

    GtkWidget *label0 = gtk_label_new("Test Label 0");
    gtk_table_attach(GTK_TABLE(table), label0, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
    GtkWidget *label1 = gtk_label_new("Test Label 1");
    gtk_table_attach(GTK_TABLE(table), label1, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);

    GtkWidget *label2 = gtk_label_new("Test Label 3");
    gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
    GtkWidget *label3 = gtk_label_new("Test Label 4");
    gtk_table_attach(GTK_TABLE(table), label3, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);

    GtkWidget *button0 = gtk_button_new_with_label("Remove Labels");
    gtk_widget_set_size_request(button0, 70, 30);
    gtk_table_attach(GTK_TABLE(table), button0, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);

    g_signal_connect(G_OBJECT(button0), "clicked", G_CALLBACK(remove_rows), table);

    gtk_container_add(GTK_CONTAINER(window), table);

    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
#包括
void remove_小部件(GtkWidget*小部件、gpointer数据)
{
if(GTK_是_标签(小部件))
{
g_打印(“移除标签”);
gtk_容器_移除(gtk_容器(数据),小部件);
}
}
无效删除_行(GtkWidget*按钮,GtkWidget*数据)
{
g_print(“删除带有标签的行\n”);
gtk_容器_foreach(gtk_容器(数据),删除_小部件,数据);
}
int main(int argc,char*argv[])
{
GtkWidget*窗口;
GtkWidget*表;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_小部件_设置_大小_请求(窗口,300250);
gtk_窗口设置可调整大小(gtk_窗口(窗口),错误);
gtk_窗口设置标题(gtk_窗口(窗口),“测试表移除”);
gtk_容器_设置_边框_宽度(gtk_容器(窗口),15);
表=gtk_表_新(3,2,假);
gtk_表设置列间距(gtk_表(表),3);
GtkWidget*label0=gtk_标签_新(“测试标签0”);
gtk_表附(gtk_表(表),标签0,0,1,0,1,gtk_填充,gtk_填充,0,0);
GtkWidget*label1=gtk_标签_新(“测试标签1”);
gtk_表附件(gtk_表(表),标签1,1,2,0,1,gtk_填充,gtk_填充,0,0);
GtkWidget*label2=gtk_标签_新(“测试标签3”);
gtk_表附(gtk_表(表),标签2,0,1,1,2,gtk_填充,gtk_填充,0,0);
GtkWidget*label3=gtk_标签_新(“测试标签4”);
gtk_表附(gtk_表(表),标签3,1,2,1,2,gtk_填充,gtk_填充,0,0);
GtkWidget*button0=gtk_按钮带_标签的新按钮(“移除标签”);
gtk小部件设置大小请求(按钮0、70、30);
gtk_表格附件(gtk_表格,按钮0,0,1,2,3,gtk_填充,gtk_填充,0,0);
g_信号连接(g_对象(按钮0),“单击”,g_回调(删除行),表格);
gtk_容器添加(gtk_容器(窗口),表格);
g_信号连接交换(g_对象(窗口),“销毁”,g_回调(gtk_主退出),g_对象(窗口));
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}

希望这有帮助,请显示您的seg错误代码。Gtk::Container remove方法应该是执行此操作的方法。请显示您的seg错误代码。Gtk::Container remove方法应该是执行此操作的方法。