如何获取适合给定区域的GTK TreeView列数?

时间:2019-06-16 02:49:05

标签: gtk

我正在编写一个使用TreeView的GTK程序,该程序应该表示非常大量的元素。为了提高性能,我决定不将它们全部保留在支持的ListStore中,而是仅显示足够的元素以适合屏幕显示,并使用“假”滚动条根据显示的位置清除并重新填充支持的ListStore。 “假”滚动条。为了使滚动正常工作,我需要准确知道我可以在屏幕上容纳多少TreeView单元格

对于初学者来说,我什至似乎都无法弄清TreeView标头的大小。我试过了,但是似乎没有用(可能是因为在他的情况下,他根本没有使用任何标题):Get Pixel Position of Item or Cell Height in Treeview

还有其他人有这个问题吗?

1 个答案:

答案 0 :(得分:1)

我在写问题时实际上找到了答案,我想还是应该把它张贴在这里。

基本上,您需要在插入列之前设置固定高度模式。然后,您可以按以下方式计算答案:

// this is a hack to work around the fact that
// gtk_tree_view_get_effective_header_height() is a private function
// see: https://github.com/GNOME/gtk/blob/6033b6457b1cf6c9ce173f9b34d56431ab49256e/gtk/gtktreeview.c#L13954
private int get_header_height() {
  int h = 0;

  if (this.get_headers_visible())
    this.convert_bin_window_to_widget_coords(0, 0, null, out h);

  return h;
}

// according to the documentation, the sum of background areas covered by
// each node adds up to the area of the entire bin window
private int get_cell_height() {
  Gdk.Rectangle rect = new Gdk.Rectangle();
  this.get_background_area(new TreePath.first(), this.get_column(0), out rect);
  return rect.height;
}

public int get_visible_columns() {
  assert(this.get_realized());

  return (int)GLib.Math.ceil((double)(this.get_allocated_height() - this.get_header_height()) / (double)this.get_cell_height());
}

我得到的结果不正确,因为并非我的所有行都具有相同的高度。差异很小,无法一目了然-直到我对程序截图并在GIMP中打开后,我才注意到。