调整Gtk TreeView列的“更好”方法......但我该怎么做?

时间:2010-09-28 20:49:55

标签: gtk

我正在尝试创建GtkTreeViewColumn调整大小功能,就像在Thunderbird中一样。这里的关键词是“尝试”。到目前为止,我还没有成功。

了解此调整大小的最简单方法是启动Thunderbird并自行调整列的大小,但基本上它在Thunderbird中的工作方式是,如果你向右拖动列#1,这会增加列#1的宽度,同时将列#2的宽度减少相同的量。这种情况发生在列#2达到其最小宽度(例如,0像素)之前。此时,继续向右拖动第1列仍然会增加第1列的宽度,但由于第2列不能再缩小,因此第3列会缩小,直到达到其最小宽度。这一直持续到#1列右侧的所有列都处于其绝对最小宽度;此时,第1列不能再增加其宽度,因此继续向右拖动列无效。

当鼠标按钮仍处于按下状态时,如果您要再次将列#1向左拖动(以缩小它),将会发生的情况是上面发生的情况,但顺序相反。当第1列收缩时,树视图中的最后一列会一直增长,直到第一次启动时原始拖动(首次按下鼠标以开始拖动)时的宽度。此时,倒数第二列会一直增长,直到达到原始拖动时的宽度......依此类推。

然后当然,当#1列到达其最小宽度时,#0列会收缩,直到达到最小宽度。由于列#0是第一列,因此继续将列#1拖到左侧将不再缩小它;事实上,什么都不会发生。

像这样处理拖动的一个主要好处是:列永远不会“超出界限”并导致GtkTreeView的宽度增大,或者如果包含GtkTreeViewColumns的GtkTreeView被打包到滚动窗口中,出现水平滚动条。出现这些滚动条,或者树视图的宽度增加(从而增加窗口的宽度)对于用户来说是非常烦人的并且使得事物看起来不那么干净。我认为,这就是为什么Thunderbird会像其他应用程序一样处理它。

所以,无论如何,我的问题是我无法弄清楚如何在GTK +中做到这一点。我想知道它是否可能?如果是......怎么办?我在这里很傻。

据我所知,你可以连接到唯一的信号来知道GtkTreeViewColumn是否已经调整大小是notify :: width信号。问题是,你不能从信号处理函数返回TRUE或FALSE告诉GTK +不允许调整大小通过。这只是一个通知信号。因此,例如,这可以防止我检测到被拖动的那一列的所有列都已达到其最小宽度,然后告诉GTK +停止该列的宽度不再增加。

另一个问题:如果你致电gtk_tree_view_column_set_fixed_width() - 我正在做的是调用gtk_tree_view_column_set_resizable(column, TRUE)然后在创建列时调用gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED),顺便说一句,在{{1}内信号,它会创建一个无限循环,我不知道如何防止。

再次,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

可以通过暂时阻止信号来打破无限循环,如下所示:

g_signal_handler_block(...);
/* update width */
g_isgnal_handler_unblock(...)

答案 1 :(得分:0)

我遇到了同样的问题,我的方法是使用2个函数来调整大小信号:

  • 第一个检查处理程序的连接/断开连接;如果没有连接,请连接并保存处理程序ID。
  • 第二个按比例调整所有列的大小,然后使用保存的处理程序ID断开信号。