首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Gtk::Viewport直接滚动(gtkmm3)

使用Gtk::Viewport直接滚动(gtkmm3)
EN

Stack Overflow用户
提问于 2021-01-20 04:40:09
回答 1查看 142关注 0票数 1

我有一个自定义容器,它通过在Gtk::Grid中嵌入Gtk::Viewport来提供滚动功能。除了一个小故障外,滚动部分工作得很完美。每当发生on_size_allocate事件时,都会导致Gtk::Adjustmentproperty_value重置为0,从而导致滚动位置跳转到顶部。因为这可能发生在任何子窗口发出队列大小调整时,甚至在顶层窗口失去焦点时,滚动位置也不会停留在它应该保持的位置。通过重写容器的on_size_allocate处理程序,我确认了property_value of Gtk::Adjustment在调用基类的on_size_allocate时重置。下面是我的on_size_allocate处理程序。

代码语言:javascript
复制
001 void CScrollGrid::on_size_allocate(Gtk::Allocation &oAlloc)
002 {
003  {
004    double dValue = m_refAdjustment->get_value();
005
006    std::cout << "size allocate (before), value: " << dValue << "\n";
007
008    Gtk::Widget::on_size_allocate(oAlloc);
009
010    std::cout
011      << "size allocate (after), value: "
012      << m_refAdjustment->get_value()
013      << "\n";
014
015    // Update scroll
016    {
017      int nMinimum;
018      int nDummy;
019
020      if (Gtk::ORIENTATION_VERTICAL
021          == m_eOrientation)
022      {
023        m_oGrid.get_preferred_height(nMinimum,
024                                     nDummy);
025      } else
026      {
027        m_oGrid.get_preferred_width(nMinimum,
028                                    nDummy);
029      }
030
031      m_refAdjustment->set_upper(nMinimum);
032    }
033
034    m_refAdjustment->property_value().set_value(dValue);
035
036    std::cout
037      << "size allocate (before fit), value: "
038      << m_refAdjustment->get_value()
039      << "\n";
040
041    Fit();
042  }
043 }

流输出如下所示。

代码语言:javascript
复制
size allocate (before), value: 146
size allocate (after), value: 0
size allocate (before fit), value: 0

在第006行,流输出打印正确的“值”。在第010行,“值”被重置为0。如您所见,我尝试在第034行应用备份值,但令人惊讶的是,第036行的流输出仍然返回0!查看gtk_viewport_size_allocate (gtk代码),我看不到任何与重置Gtk::Adjustment相关的明显内容。

什么会导致Gtk::Adjustments?

  • How被设置为非零值时仍停留在0?

  • 是什么机制使Gtk::Viewport重置它的

  • ,我可以阻止Gtk::Adjustment::property_value被重置,比如这里发生了什么?

注意:由于以下原因,我没有使用Gtk::ScrolledWindow。滚动区域内的“行”可能有不同的高度。尽管如此,可见区域需要完整地显示第一行和最后一行,而不需要裁剪。如果这是不可能的,则省略最后一行,并将额外的空间转换为在顶部和底部之间均匀分布的填充。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-25 12:06:21

找出了我的错误。我应该只调用on_size_allocate,而不是调用父类set_allocation。此外,没有必要更新Gtk::Adjustment的上限,Gtk::ViewPort在内部进行更新。下面的代码运行良好。

代码语言:javascript
复制
001 void CScrollGrid::on_size_allocate(Gtk::Allocation &oAlloc)
002 {
003     set_allocation(oAlloc);
004 
005     Fit();
006 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65803182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档