如何检测QTableWidget滚动源(代码本身/用户(滚轮)/用户(滚动条))?
我正在使用Qt4.8编写一个程序,它显示一个表格(QTableWidget),表格中填充了文件名和文件参数。首先,用户将文件添加到列表中,然后单击“处理”。代码本身使用简单的进度描述更新表的内容。我希望表在默认情况下自动滚动,以显示最后处理的文件,并且代码已准备就绪 如果我想手动滚动,只要有什么变化,就会自动滚动小部件,将视口移动到最后一个元素。如果我检测到是用户想要更改视图,我希望能够覆盖自动滚动 这种行为可以在许多终端仿真器程序中看到。当添加新行时,视图会滚动,但当用户强制终端查看以前的一些行时,终端不会尝试向下滚动 我怎么能这么做 解决方案: 我创建了一个对象,用于过滤嵌入其中的QTableWidget和QScrollBar处理的事件。如果我发现应该关闭自动滚动的事件,我只需设置一个标志,如果设置了该标志,则停止滚动视图 一切都在tableController类中实现。以下是三种关键方法的一部分如何检测QTableWidget滚动源(代码本身/用户(滚轮)/用户(滚动条))?,qt,qtablewidget,Qt,Qtablewidget,我正在使用Qt4.8编写一个程序,它显示一个表格(QTableWidget),表格中填充了文件名和文件参数。首先,用户将文件添加到列表中,然后单击“处理”。代码本身使用简单的进度描述更新表的内容。我希望表在默认情况下自动滚动,以显示最后处理的文件,并且代码已准备就绪 如果我想手动滚动,只要有什么变化,就会自动滚动小部件,将视口移动到最后一个元素。如果我检测到是用户想要更改视图,我希望能够覆盖自动滚动 这种行为可以在许多终端仿真器程序中看到。当添加新行时,视图会滚动,但当用户强制终端查看以前的一些
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
overQEvent::type()
一次处理多个事件。好的,这更有意义。我试试这个。我想我必须找出发送了什么事件以及是谁发送的。如果你在QTableWidget上安装了事件过滤器,那就足够了。。您正在专门查找WheelEvent、ScrollEvent和KeyPressEvent。我不知道它是唯一获取所有事件的QTableWidget还是也获取这些消息的滚动条。我可能需要点击这两个地方…试着对你的答案做一个简短的描述。
connect(_table->view()->verticalScrollBar(), &QAbstractSlider::actionTriggered, this, [this](int) {
_autoScrollEnabled = false;
});