首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Glade/gtkmm TreeView

Glade/gtkmm TreeView
EN

Stack Overflow用户
提问于 2015-09-11 18:56:12
回答 1查看 1.7K关注 0票数 1

在对我的previous question在这个问题上的回答之后,我已经取得了一些进展,并正在寻找下一个指导。简而言之,我在用gtkmm应用程序从Glade加载Treeview时遇到了困难。

首先,这是来源。全班:

代码语言:javascript
运行
复制
typedef struct
{
  Gtk::Window *window_info;
  Gtk::TreeView *treeview_info;
  Glib::RefPtr<Gtk::ListStore> liststore_info;

  class InfoColumns : public Gtk::TreeModel::ColumnRecord
  {
    public:
      InfoColumns() { add(time); add(message); }

      Gtk::TreeModelColumn<string> time;
      Gtk::TreeModelColumn<string> message;
  } info_columns;

}UiElements;

class GuiManager
{
  Glib::RefPtr<Gtk::Builder> builder;
  UiElements elements;

  public:
    GuiManager();

    void info_handler(string msg);
};

定义:

代码语言:javascript
运行
复制
GuiManager::GuiManager()
{
  builder = Gtk::Builder::create();
  builder->add_from_file("GUI3.glade");

  builder->get_widget("window_info", elements.window_info);
  builder->get_widget("treeview_info", elements.treeview_info);

//these two methods of loading the liststore appear to function identically
  elements.liststore_info = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(builder->get_object("liststore_info"));
//  elements.liststore_info = Gtk::ListStore::create(elements.info_columns);

  elements.treeview_info->set_model(elements.liststore_info);

//if I append the columns, the data appears at the end of the list
//  elements.treeview_info->append_column("Time", elements.info_columns.time);
//  elements.treeview_info->append_column("Message", elements.info_columns.message);
}

void GuiManager::info_handler(string msg)
{
  Gtk::TreeModel::Row row = *(elements.liststore_info->append());
  row[elements.info_columns.time] = "Now";
  row[elements.info_columns.message] = msg;
}

以及XML:

代码语言:javascript
运行
复制
<object class="GtkListStore" id="liststore_info">
  <columns>
    <!-- column-name Time -->
    <column type="gchararray"/>
    <!-- column-name Message -->
    <column type="gchararray"/>
  </columns>
</object>
<object class="GtkWindow" id="window_info">
  <property name="can_focus">False</property>
  <property name="title" translatable="yes">Info</property>
  <child>
    <object class="GtkScrolledWindow" id="scrolledwindow_info">
      <property name="visible">True</property>
      <property name="can_focus">True</property>
      <property name="shadow_type">in</property>
      <property name="min_content_width">400</property>
      <property name="min_content_height">600</property>
      <child>
        <object class="GtkTreeView" id="treeview_info">
          <property name="visible">True</property>
          <property name="can_focus">True</property>
          <property name="model">liststore_info</property>
          <property name="enable_search">False</property>
          <property name="enable_grid_lines">both</property>
          <child internal-child="selection">
            <object class="GtkTreeSelection" id="treeview_info_selection"/>
          </child>
          <child>
            <object class="GtkTreeViewColumn" id="treeview_info_column_time">
              <property name="resizable">True</property>
              <property name="sizing">autosize</property>
              <property name="min_width">100</property>
              <property name="title" translatable="yes">Time</property>
              <property name="clickable">True</property>
              <child>
                <object class="GtkCellRendererText" id="treeview_info_cellrenderer_time"/>
              </child>
            </object>
          </child>
          <child>
            <object class="GtkTreeViewColumn" id="treeview_info_column_message">
              <property name="resizable">True</property>
              <property name="sizing">autosize</property>
              <property name="min_width">300</property>
              <property name="title" translatable="yes">Message</property>
              <property name="clickable">True</property>
              <child>
                <object class="GtkCellRendererText" id="treeview_info_cellrenderer_message"/>
              </child>
            </object>
          </child>
        </object>
      </child>
    </object>
  </child>
</object>

当我编译和运行这段代码(加上对info_handler()的一个调用)时,我会得到一个有一行和两个空列的treeview。当我取消在列后面的两行注释时,我会得到一个具有一行和四列的treeview。前两列为空白(并根据glade文件进行大小调整),第二列具有"Now"msg字符串(并根据内容自动调整大小)。

我从中得出的结论是,elements.info_columns并不通过elements.liststore_infoelements.treeview_info相关联。看来我只是漏了一步把两者连接起来。liststore_info被列为treeview_info在glade文件中的模型,以及GuiManager的构造函数中设置的模型。

断线在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-13 02:35:53

我认为您需要设置每个表列中应该显示的列表存储字段。

  1. 在Glade中,右键单击树小部件,然后单击编辑.(不是编辑单独的)
  2. 单击层次结构选项卡
  3. 单击列
  4. 属性和属性下,确保标记文本,并从下拉列表中选择正确的list存储列(这将相应地更新索引)。对于Pixbuf列,您需要Pixbuf对象而不是Text
  5. 对每一列重复

在您的示例中,我认为时间列的索引应为0,消息列的索引为1,其他字段的索引为-1。

这将从列表存储中的选定字段填充列的文本。我相信它是这样做的,这样您就可以填充列的其他属性(字体、颜色等)。如果你想的话,也可以通过列表商店。

与此无关,我还会考虑将Gtk::TreeModelColumn<string>更改为Gtk::TreeModelColumn<Glib::ustring>,因为我认为,您现在使用的方式可能会导致每次树视图重新绘制自己时都会发生到/从Glib::ustring的转换。从一开始就将它保持为Glib::ustring应该可以避免大部分这种转换。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32530367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档