我正在写使用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);
[...]
}
感谢所有帮助。 我希望有人会发现它有用:)