首页 > 解决方案 > 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 是 aGtkScrolledWindow并且是 的子级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对象。它只是输出一个空窗口。我尝试删除滚动窗口并在堆栈顶部添加一个简单的标签,效果很好。但是,当我添加类似 a GtkScrolledWindowwith children in 时,它就失败了。我真的不知道为什么会有任何帮助将不胜感激。

标签: clinuxgtkglade

解决方案


推荐阅读