如何使用gtkmm在TreeView中使单个项目加粗

How to make a single item bold in TreeView using gtkmm?

本文关键字:单个 项目 何使用 gtkmm TreeView      更新时间:2023-10-16

在做append_column时可以提供一个CellRenderer (Gtk::CellRendererText),在其中可以使用property_weight来设置权重。

但是,这会改变整个列,我的目标是能够将单个项目加粗。是否有一个内置的方法来做这件事?

要求是能够随时将一个项目从常规文本更改为粗体。

所以如果我有:

  Gtk::TreeModel::Row row = *(treeModel->append());
  row[treeColumns.id] = 1;
  row[treeColumns.name] = "[one]";
  Gtk::TreeModel::Row childrow = *(treeModel->append(row.children()));
  childrow[treeColumns.id] = 11;
  childrow[treeColumns.name] = "<b>eleven</b>";
  childrow = *(treeModel->append(row.children()));
  childrow[treeColumns.id] = 12;
  childrow[treeColumns.name] = "twelve";
  row = *(treeModel->append());
  row[treeColumns.id] = 2;
  row[treeColumns.name] = "two";
  //Add the TreeView's view columns:
  treeView->append_column("Name", treeColumns.name);
//  treeView->append_column("ID", treeColumns.id);
    treeView->expand_all();

然后我想元素号11变成粗体(它目前有HTML标签只突出这一点),我怎么能做到这一点?

如果你指定你自己的CellRenderer,那么你可能也想指定你自己的cell_data_func,通过set_cell_data_func():https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeViewColumn.html a765296845c9e9757ba405becbbc13d96

在那个回调中你可以改变单元格的属性。它看起来像这样:

MyTreeView::MyTreeView()
{
  ...
  Gtk::TreeViewColumn view_column = Gtk::manage(new Gtk::TreeViewColumn(_("Name")));
  Gtk::CellRendererText cell = Gtk::manage(new Gtk::CellRendererText());
  view_column->pack_start(*cell, false);
  view_column->set_cell_data_func(*cell, sigc::mem_fun(*this, &MyTreeView::on_cell_data_name));
  append_column(view_column);
  ...
}

void MyTreeView::on_cell_data_name(
  Gtk::CellRenderer* renderer,
  const Gtk::TreeModel::iterator& iter)
{
  //Get the value from the model and show it appropriately in the view:
  Gtk::TreeModel::Row row = *iter;
  int id = row[m_columns.m_col_id];
  Glib::ustring name = row[m_columns.m_col_name];
  if (id == SOME_MAGIC_NUMBER)
    name = "<b>" + name + "</b>";
  Gtk::CellRendererText* text_renderer = dynamic_cast<Gtk::CellRendererText*>(renderer);
  if(text_renderer)
    text_renderer.property_markup() = name;
  }
}

比起使用标记,您可能更喜欢使用单元格渲染器的font属性。