GTK+ 警告:无法在具有父级的小部件上设置父项
GTK+ Warning: Can't set a parent on widget which has a parent
我正在尝试使用GTK+为我的音乐管理器编写接口。程序已成功编译。然而,当我执行它时,机器返回错误:
(dingo_draft:6462): Gtk-WARNING **: Can't set a parent on widget which has a parent
(dingo_draft:6462): Gtk-CRITICAL **: gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
**
Gtk:ERROR:/build/buildd/gtk+2.0-2.20.1/gtk/gtkwidget.c:8760:gtk_widget_real_map: assertion failed: (gtk_widget_get_realized (widget))
Aborted
这是程序的源代码。请注意,这只是用GTK+编写的接口。我还没有添加任何信号。我认为GTK+功能可能有一些问题,但我找不到错误发生的位置:
/* This is the interface design draft for the media player
/* This does not include the signals for widgets. Just a plain draft */
#include <gtk/gtk.h>
#include <gst/gst.h>
int main(int argc, char *argv[]) {
/* Initialize gtk+ & gstreamer */
gtk_init(&argc, &argv);
gst_init(&argc, &argv);
/* Create mainwindow (mainwindow) */
GtkWidget *mainwindow;
mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(mainwindow), "Music Manager");
/* Create the vbox containing searchbox & song list (treevbox) */
GtkWidget *searchbox, *treesong, *scrollsong, *treevbox;
/* GtkWidget *colname, *coltime; */
GtkCellRenderer *namerender, *timerender;
treesong = gtk_tree_view_new();
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treesong), FALSE);
namerender = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treesong), -1, "Songs", namerender, "text", 0, NULL);
timerender = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treesong), -1, "Time", timerender, "text", 1, NULL);
scrollsong = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollsong), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrollsong), treesong);
searchbox = gtk_entry_new();
treevbox = gtk_vbox_new(TRUE, 0);
gtk_box_pack_start_defaults(GTK_BOX(treevbox), searchbox);
gtk_box_pack_start_defaults(GTK_BOX(treevbox), scrollsong);
/* Create the song info section (infohbox) */
GtkWidget *songname, *songinfo, *coverart;
GtkWidget *infohbox, *imagevbox;
coverart = gtk_image_new_from_file("music-notes.png");
songname = gtk_label_new("<i>Song Name</i>");
songinfo = gtk_label_new("<b>Artist:</b> n <b>Track</b> n <b>Album</b> n <b>Year</b> n <b>Genre</b> n <b>Rating</b>");
infohbox = gtk_hbox_new(TRUE, 0);
imagevbox = gtk_vbox_new(TRUE, 0);
gtk_box_pack_start_defaults(GTK_BOX(imagevbox), coverart);
gtk_box_pack_start_defaults(GTK_BOX(imagevbox), songname);
gtk_box_pack_start_defaults(GTK_BOX(infohbox), imagevbox);
gtk_box_pack_start_defaults(GTK_BOX(infohbox), songinfo);
/* Create drawing area for video display (previewarea) */
GtkWidget *previewarea;
previewarea = gtk_drawing_area_new();
gtk_widget_set_size_request(previewarea, 300, 200);
/* Create actions tree view (ltreeview) */
enum {
COL_ICON = 0,
COL_ACTION,
NUM_COLS
};
GtkCellRenderer *lrenderer;
GtkTreeModel *lmodel;
GtkWidget *ltreeview;
GtkListStore *lliststore;
GtkTreeIter liter;
ltreeview = gtk_tree_view_new();
lrenderer = gtk_cell_renderer_pixbuf_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(ltreeview), -1, "Icon", lrenderer, "pixbuf", COL_ICON, NULL);
lrenderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(ltreeview), -1, "Actions", lrenderer, "text", COL_ACTION, NULL);
lliststore = gtk_list_store_new(NUM_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
gtk_list_store_append(lliststore, &liter);
gtk_list_store_set(lliststore, &liter, COL_ICON, gdk_pixbuf_new_from_file("now-playing.png", NULL), COL_ACTION, "Now Playing", -1);
gtk_list_store_append(lliststore, &liter);
gtk_list_store_set(lliststore, &liter, COL_ICON, gdk_pixbuf_new_from_file("music.png", NULL), COL_ACTION, "Music", -1);
gtk_list_store_append(lliststore, &liter);
gtk_list_store_set(lliststore, &liter, COL_ICON, gdk_pixbuf_new_from_file("video.png", NULL), COL_ACTION, "Videos", -1);
gtk_list_store_append(lliststore, &liter);
gtk_list_store_set(lliststore, &liter, COL_ICON, gdk_pixbuf_new_from_file("playlist.png", NULL), COL_ACTION, "Playlists", -1);
lmodel = GTK_TREE_MODEL(lliststore);
gtk_tree_view_set_model(GTK_TREE_VIEW(ltreeview), lmodel);
/* g_object_unref(lmodel); */
/* Create the top control bar (controlhbox) */
GtkWidget *prevbutton, *nextbutton, *hscale, *cursong;
GtkWidget *curpos, *duration, *volumebutton, *playbutton;
GtkAdjustment *progress, *volumeadj;
GtkWidget *buttonhbox, *proghbox, *infovbox, *controlhbox;
prevbutton = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(prevbutton), gtk_image_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS, GTK_ICON_SIZE_SMALL_TOOLBAR));
playbutton = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(playbutton), gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_DND));
nextbutton = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(nextbutton), gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_SMALL_TOOLBAR));
progress = GTK_ADJUSTMENT(gtk_adjustment_new(0.00, 0.00, 0.00, 0.00, 0.00, 0.00));
hscale = gtk_hscale_new(progress);
gtk_scale_set_draw_value(GTK_SCALE(hscale), FALSE);
gtk_widget_set_size_request(hscale, 500, NULL);
cursong = gtk_label_new("Song's Name");
curpos = gtk_label_new("0:00");
duration = gtk_label_new("0:00");
volumebutton = gtk_volume_button_new();
volumeadj = GTK_ADJUSTMENT(gtk_adjustment_new(0.70, 0.00, 1.00, 0.01, 0.00, 0.00));
gtk_scale_button_set_adjustment(GTK_SCALE_BUTTON(volumebutton), volumeadj);
gtk_widget_set_size_request(volumebutton, 32, 32);
buttonhbox = gtk_hbox_new(TRUE, 0);
gtk_box_pack_start_defaults(GTK_BOX(buttonhbox), prevbutton);
gtk_box_pack_start_defaults(GTK_BOX(buttonhbox), playbutton);
gtk_box_pack_start_defaults(GTK_BOX(buttonhbox), nextbutton);
proghbox = gtk_hbox_new(TRUE, 0);
gtk_box_pack_start_defaults(GTK_BOX(proghbox), curpos);
gtk_box_pack_start_defaults(GTK_BOX(proghbox), hscale);
gtk_box_pack_start_defaults(GTK_BOX(proghbox), duration);
controlhbox = gtk_hbox_new(TRUE, 0);
gtk_box_pack_start_defaults(GTK_BOX(controlhbox), buttonhbox);
gtk_box_pack_start_defaults(GTK_BOX(controlhbox), proghbox);
gtk_box_pack_start_defaults(GTK_BOX(controlhbox), volumebutton);
/* Create panes (tophpaned) and pack widgets into this (tophpaned)*/
GtkWidget *tophpaned, *subhpaned, *vpaned;
vpaned = gtk_vpaned_new();
gtk_paned_add1(GTK_PANED(vpaned), songinfo);
gtk_paned_add2(GTK_PANED(vpaned), previewarea);
subhpaned = gtk_hpaned_new();
gtk_paned_pack1(GTK_PANED(subhpaned), vpaned, TRUE, TRUE);
gtk_paned_pack2(GTK_PANED(subhpaned), treevbox, TRUE, TRUE);
tophpaned = gtk_hpaned_new();
gtk_paned_pack1(GTK_PANED(tophpaned), ltreeview, TRUE, TRUE);
gtk_paned_pack2(GTK_PANED(tophpaned), subhpaned, TRUE, TRUE);
/* Create an topvbox to pack all the above stuffs in, */
/* then add topvbox to window */
GtkWidget *topvbox;
topvbox = gtk_vbox_new(TRUE, 0);
gtk_box_pack_start_defaults(GTK_BOX(topvbox), controlhbox);
gtk_box_pack_start_defaults(GTK_BOX(topvbox), tophpaned);
gtk_container_add(GTK_CONTAINER(mainwindow), topvbox);
/* Show all widgets & draw the interface */
gtk_widget_show_all(mainwindow);
gtk_main();
return 0;
}
谢谢你回答我的问题!我感谢你的帮助!
您正试图将songinfo
放入两个不同的容器中:infohbox
和vpaned
。
正如Havoc所说,gdb可以帮助您找到给出警告的确切代码。我可以提供两个额外的建议:
- 在Glade中构建您的界面。这将帮助你在构建它的过程中了解它的情况。它还将使它更易于维护,并帮助你避免这些错误
- 在你问一个关于带有大代码转储的堆栈溢出的问题之前,试着制作一个能重现这个问题的最小程序。通常情况下,当你这样做的时候,你已经自己解决了这个问题
在调试器(gdb)中运行,在第一条警告消息上设置断点(过去是所有警告都经过的g_logv,但检查glibsource(如果需要),然后在gdb中键入"bt"(当它断开时),查看是哪一行引起了警告。
另一种方法是在环境中设置G_DEBUG=fatal-warnings
,然后再次使用gdb,不需要断点,只要在应用程序出现警告时进行回溯即可。
另一个可能的步骤是在Valgrind中运行,并在内存访问或写入不好的情况下修复它的抱怨。
相关文章:
- 由于PC显示设置的更改,Qt小部件被部分剪裁
- C++ wxWidgets:在创建小部件后设置字体
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 如何从 css 资源为 gtkmm3 中的多个 glade 小部件设置主题
- 在运行时为随机分布类成员设置最小和最大边界?
- 为提升的小部件设置父 QWidget
- Qt自定义小部件外观在设置样式表后没有变化
- 将小部件大小设置为另一个大小的一半
- 是否可以保证输入<Type>实数时复杂对象的虚部设置为零?
- 如何在Windows下的文件上设置一个小图标
- 设置QPUSHBUTTON的最小宽度,同时保持默认的最小尺寸行为
- 无法获得固定的设置精度双精度以显示小数位
- Qt在QTableView中设置自定义小部件
- 如何在 QWidgetAction 的子类中设置小部件的可见性
- QDial 设置范围从 0.00 到 10.00 到小部件显示
- 为什么在将小部件设置为中央时不显示场景
- C++ 创建小部件数组
- 使用许多小部件设置UI对象
- 在Qt中为整个小部件设置样式表
- 如何从QT-Designer为小部件设置默认可见性值