如何检测QTableWidget的滚动源(代码本身/用户(轮)/用户(滚动))?(How to de

2019-10-17 04:23发布

我正在写使用Qt 4.8的程序显示充满了文件名和文件的PARAMS表(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);
   [...]
}

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

Answer 1:

子类QTableWidget和过载的wheelEvent 。 您可以使用附带的参数QWheelEvent对象,以确定用户上下滚动时。

然后在你使用的是设置一个简单的布尔标志(或复位) wheelEvent覆盖。 它负责调用方法scrollToBottom()应该再考虑此布尔标志。

你必须找到一种方法来找出何时设置或重置该标志,例如总是把它当用户滚动和复位它,当用户向下滚动和当前显示的区域是在底部。



Answer 2:

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


文章来源: How to detect QTableWidget scroll source (code itself/user (wheel)/user (scrollbar))?