Я действительно нашел ответ во время написания вопроса, и я подумал, что я все равно опубликую его здесь.
Как правило, вам нужно установить режим фиксированной высоты, прежде чем вставлять столбцы . Затем вы можете вычислить ответ следующим образом:
// 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.