如何使用 gtkmm 在 TreeView 中使单个项目变为粗体?

Posted

技术标签:

【中文标题】如何使用 gtkmm 在 TreeView 中使单个项目变为粗体?【英文标题】:How to make a single item bold in TreeView using gtkmm? 【发布时间】:2015-07-06 06:35:05 【问题描述】:

在执行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 标记来突出显示这一点),我将如何做到这一点?

【问题讨论】:

【参考方案1】:

如果您指定自己的 CellRenderer,那么您可能还想通过 set_cell_data_func() 指定自己的 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;
  

您可能更喜欢使用单元格渲染器的字体属性,而不是使用标记。

【讨论】:

以上是关于如何使用 gtkmm 在 TreeView 中使单个项目变为粗体?的主要内容,如果未能解决你的问题,请参考以下文章

Gtkmm3 TreeView ListStore.Clear 或 TreeSelection.unselectAll 导致错误

带有 gtkmm 的 Glade 构建的 TreeView

Gtkmm TreeView:访问动态添加的列

gtkmm treeview set_activate_on_single_click 无法编译

gtkmm 中树视图选择回调的签名和功能

如何从gtkmm树视图中获取所选行