1

我正在使用 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);
   [...]
}

感谢所有的帮助。我希望有人会觉得它有用:)

4

2 回答 2

0

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

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

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

于 2012-08-23T06:37:07.770 回答
0
connect(_table->view()->verticalScrollBar(), &QAbstractSlider::actionTriggered, this, [this](int) {
    _autoScrollEnabled = false;
});
于 2019-06-07T08:06:31.100 回答