如何解决Gtk GtkScrolledWindow 未显示为 GtkStack 子
我有以下测试代码,其中包含 Gtk 和 Libhandy 库的片段。
#include <gtk/gtk.h>
#include <stdio.h>
#define HANDY_USE_UNSTABLE_API
#include <handy.h>
int main(int argc,char *argv[])
{
gtk_init(&argc,&argv);
GtkBuilder * builder = gtk_builder_new();
gtk_builder_add_from_resource(builder,"/progname/interface/product-window.ui",NULL);
GtkWidget * window = GTK_WIDGET(gtk_builder_get_object(builder,"CcWindow"));
HdyLeaflet * leaflet = HDY_LEAFLET(gtk_builder_get_object(builder,"main_leaflet"));
GtkStack * stack = GTK_STACK(gtk_builder_get_object(builder,"stack"));
GtkWidget * swindow = GTK_WIDGET(gtk_builder_get_object(builder,"swindow"));
//hdy_leaflet_set_visible_child(leaflet,stack);
gtk_stack_set_visible_child(stack,swindow);
gtk_widget_show_all(window);
gtk_main();
g_object_unref(builder);
g_object_unref(window);
return 0;
}
它使用的 .ui 文件是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<requires lib="libhandy" version="0.0"/>
<object class="GtkApplicationWindow" id="CcWindow">
<property name="can-focus">False</property>
<property name="window-position">center</property>
<property name="default-width">980</property>
<property name="default-height">640</property>
<signal name="key-press-event" handler="window_key_press_event_cb" object="CcWindow" after="yes" swapped="yes"/>
<signal name="map-event" handler="window_map_event_cb" object="CcWindow" swapped="yes"/>
<signal name="notify::window" handler="gdk_window_set_cb" object="CcWindow" swapped="yes"/>
<child>
<object class="HdyLeaflet" id="main_leaflet">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="visible-child">stack</property>
<property name="transition-type">slide</property>
<signal name="notify::folded" handler="on_main_leaflet_folded_changed_cb" object="CcWindow" swapped="yes"/>
<child>
<object class="GtkStack" id="stack">
<property name="width-request">360</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="transition-type">crossfade</property>
<child>
<object class="GtkScrolledWindow" id="swindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="HdyClamp">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<!-- n-columns=1 n-rows=40 -->
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="row-spacing">15</property>
<property name="column-spacing">7</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkFileChooserButton" id="product_picture_id">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">Ավելացնել նկար</property>
<property name="width-chars">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="placeholder-text" translatable="yes">Մատակարար ID</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="name">page1</property>
<property name="title" translatable="yes">page1</property>
</packing>
</child>
<style>
<class name="background"/>
</style>
</object>
</child>
</object>
</child>
</object>
</interface>
注意方法
<child>
<object class="GtkScrolledWindow" id="swindow">
swindow 是一个 GtkScrolledWindow
并且是 stack
的孩子。所以这意味着如果我想显示带有 gtk_widget_show_all()
的所有子窗口的窗口,我应该首先将堆栈的可见子项设置为 swindow
对吗?所以在代码中我有以下几行:
gtk_stack_set_visible_child(stack,swindow);
但它会导致以下运行时错误
Given child of type 'GtkScrolledWindow' not found in GtkStack
即使在 .ui 文件中,它也清楚地将 GtkScrolledWindow
对象声明为 GtkStack
对象的子对象。它只是输出一个空窗口。我试过删除滚动窗口,只在堆栈顶部添加一个简单的标签,效果很好。但是,当我添加带有孩子的 GtkScrolledWindow
之类的东西时,就失败了。我真的不知道为什么所以任何帮助将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。