如何检测QTableWidget滚动源(代码本身/用户(滚轮)/用户(滚动条))?

时间:2012-08-22 19:47:58

标签: qt scroll

我正在使用Qt 4.8编写一个程序,它显示一个填充了文件名和文件参数的表(QTableWidget)。首先,用户将文件添加到列表中,然后单击进程。代码本身使用简单的进度描述更新表的内容。我希望默认情况下自动滚动表以显示最后处理的文件,并且该代码已准备就绪。

如果我想手动滚动它,只要某些内容发生变化,就会自动滚动窗口小部件,将视口移动到最后一个元素。如果我检测到是想要更改视图的用户,我希望能够覆盖自动滚动。

在许多终端仿真器程序中都可以看到此行为。当添加了新行时,视图会滚动,但是当用户强制终端看到前面的某些行时,终端不会尝试向下滚动。

我怎么能这样做?

解决方案:

我创建了一个对象,它过滤我的QTableWidget处理的事件和嵌入在里面的QScrollBar。如果我发现应关闭自动滚动的事件,我只需设置一个标志并停止滚动视图,如果设置了该标志。

一切都在tableController类中实现。以下是三个关键方法的一部分。

bool tableController::eventFilter(QObject* object, QEvent* event)
{
  switch (event->type())
  {
    case QEvent::KeyPress:
    case QEvent::KeyRelease:
    case QEvent::Wheel:
    case QEvent::MouseButtonDblClick:
    case QEvent::MouseButtonPress:
    case QEvent::MouseButtonRelease:
      _autoScrollEnabled = false;
    default:
      break;
  }
  return QObject::eventFilter(object, event);
}

void tableController::changeFile(int idx)
{
  [...]
  if (_autoScrollEnabled)
  {
    QTableWidgetItem* s = _table.item(_engine.getLastProcessed(), 1);
    _table.scrollToItem(s);
  }
  [...]
}

void tableController::tableController()
{
   [...]
   _autoScrollEnabled = true;
   _table.installEventFilter(this);
   _table.verticalTableScrollbar()->installEventFilter(this);
   [...]
}

感谢所有帮助。我希望有人会发现它很有用:)

2 个答案:

答案 0 :(得分:0)

子类QTableWidget并重载其wheelEvent。您可以使用提供的QWheelEvent对象的参数来确定用户是向上还是向下滚动。

然后使用在wheelEvent覆盖中设置(或重置)的简单布尔标志。负责调用scrollToBottom()的方法应该考虑这个布尔标志。

您必须找到一种方法来确定何时设置或重置该标志,例如当用户向上滚动并在用户向下滚动时重置它并且当前显示的区域位于底部时,总是设置它。

答案 1 :(得分:0)

connect(_table->view()->verticalScrollBar(), &QAbstractSlider::actionTriggered, this, [this](int) {
    _autoScrollEnabled = false;
});