GtkScrolledWindow - 如何始终显示覆盖滚动条

Posted

技术标签:

【中文标题】GtkScrolledWindow - 如何始终显示覆盖滚动条【英文标题】:GtkScrolledWindow - How to always show the overlay scrollbar 【发布时间】:2018-09-19 21:03:48 【问题描述】:

我正在使用一个 GTK3 应用程序,该应用程序需要始终可见、始终处于活动状态的滚动条和可见的步进器。我已经能够用 css 实现这一点:

scrollbar.hover,
scrollbar 
    margin-left: 2px;
    -GtkScrollbar-has-backward-stepper: 1;
    -GtkScrollbar-has-forward-stepper: 1;


scrollbar trough 
    min-width: 30px;


scrollbar button 
    min-height: 30px;
    min-width: 30px;


scrollbar.right slider 
    min-height: 70px;
    min-width: 30px;

连同此代码:

GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); //never horizontal, always vertical
g_object_set(sw, "overlay-scrolling", FALSE, NULL);

然而overlay-scrolling 设置为FALSE 意味着滚动条在GtkScrolledWindow 的一侧,而不是在其中。这会导致应用程序(从早期版本的 gtk 移植的遗留应用程序)出现布局问题。

但是,如果我启用覆盖滚动,滚动条会在几秒钟后隐藏,而 GtkScolledWindow 没有运动事件。

我一直在使用 GtkInspector 来解决任何我可以尝试禁用隐藏滚动条的操作,但没有成功。

一个技巧是设置一个计时器来不断向窗口发送运动事件以防止滚动条隐藏......但这非常难看。

关于在哪里找到禁用覆盖滚动条隐藏的秘诀有什么建议吗?

【问题讨论】:

另外,如果覆盖滚动被禁用,一种使滚动条扩展 GtkTreeView 的完整高度的方法,而不仅仅是内容区域。 【参考方案1】:

简短的回答是您不能按原样使用 GtkScrollableWindow。

我深入研究了source code of the GtkScrollableWindow(搜索“不透明度”)以确认这种行为已被纳入。

这可能会通过向窗口发送一个周期性的“运动”信号来欺骗它保持滚动条可见(丑陋!),或者,当然,修改 GtkScrollableWindow 源代码。不太麻烦的是实现我自己的 GtkScrollable,或者通过创建 GtkOverlay 并将 GtkScrollbar 放在 GtkScrollableWindow 顶部并将这些滚动条操作映射到窗口。

这对项目来说是较低的优先级,所以我可能没有机会更进一步,但如果任何读者能够加入“最佳”方法,至少我的好奇心将不胜感激 :)

【讨论】:

以上是关于GtkScrolledWindow - 如何始终显示覆盖滚动条的主要内容,如果未能解决你的问题,请参考以下文章

Mozilla 撤消“始终阻止通知”

GWT 2.5.1编译始终抛出Java堆空间错误

如何成为一名白帽子

RateOfCountsPerSecond64 类型的性能计数器的值始终为 0

如何使用 PLSQL 动态打印唯一数字

如何在 R 中执行测试的现场显着性