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

如何检测QTableWidget滚动源(代码本身/用户(滚轮)/用户(滚动条))?,qt,qtablewidget,Qt,Qtablewidget,我正在使用Qt4.8编写一个程序,它显示一个表格(QTableWidget),表格中填充了文件名和文件参数。首先,用户将文件添加到列表中,然后单击“处理”。代码本身使用简单的进度描述更新表的内容。我希望表在默认情况下自动滚动,以显示最后处理的文件,并且代码已准备就绪 如果我想手动滚动,只要有什么变化,就会自动滚动小部件,将视口移动到最后一个元素。如果我检测到是用户想要更改视图,我希望能够覆盖自动滚动 这种行为可以在许多终端仿真器程序中看到。当添加新行时,视图会滚动,但当用户强制终端查看以前的一些

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

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

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

然后使用在
wheeleevent
覆盖中设置(或重置)的简单布尔标志。负责调用<代码> ScRotoButoMo()/代码>的方法应该考虑这个布尔标志。< /P>
您必须找到一种方法来确定何时设置或重置该标志,例如,在用户向上滚动时始终设置该标志,在用户向下滚动时重置该标志,并且当前显示的区域位于底部。

问题在于,它不仅与滚轮滚动有关,还与用户按下箭头有关,向上/向下翻页,并使用提供的垂直滚动条(同样,通过滚轮滚动或使用末端的按钮)。滚动视图的方法太多了,我想点击一个可以同时执行所有操作的地方。您可以使用
QObject::installEventFilter()
,然后
switch/case
over
QEvent::type()
一次处理多个事件。好的,这更有意义。我试试这个。我想我必须找出发送了什么事件以及是谁发送的。如果你在QTableWidget上安装了事件过滤器,那就足够了。。您正在专门查找WheelEvent、ScrollEvent和KeyPressEvent。我不知道它是唯一获取所有事件的QTableWidget还是也获取这些消息的滚动条。我可能需要点击这两个地方…试着对你的答案做一个简短的描述。
connect(_table->view()->verticalScrollBar(), &QAbstractSlider::actionTriggered, this, [this](int) {
    _autoScrollEnabled = false;
});