如何在实时数据输入期间将 QTableWidget 设置为始终滚动到底部
Posted
技术标签:
【中文标题】如何在实时数据输入期间将 QTableWidget 设置为始终滚动到底部【英文标题】:How to set a QTableWidget to consistently scroll to bottom during live data input 【发布时间】:2014-06-13 17:51:01 【问题描述】:我目前有一个实现 QTableWidget 的工作 GUI(不要与 QTableView 混淆)。这个 QTableWidget 接收实时数据流,我想要它,所以出现的垂直滚动条默认位于底部。我尝试了几种方法,包括 setToBottom() 都没有成功。我知道使用 QTableView 有很多方法可以做到这一点,但是我正在寻找一种通过 QTableWidget 做到这一点的方法。
【问题讨论】:
【参考方案1】:您可以在插入新项目后使用self.ui.tableWidget.scrollToBottom
。但它并不总是按预期工作。它只将滚动条移动到插入的最后一行的开头,这不一定是表格的底部,因为有时插入的最后一行的高度非常大。
所以我认为这是一个始终滚动到 tablewidget 底部的好方法:
item = self.ui.tableWidget.item(lastIndex, 0)
self.ui.tableWidget.scrollToItem(item, QtGui.QAbstractItemView.PositionAtTop)
self.ui.tableWidget.selectRow(lastIndex)
scrollToItem
滚动视图以确保项目可见。提示参数更精确地指定操作后项目应位于的位置。这里PositionAtTop
滚动以将项目定位在视口的顶部,lastIndex
是插入到表格中的最后一个项目的索引。
【讨论】:
这暂时有效,但它会立即崩溃。为了让您了解我更新此表的速度,它每秒大约有 20-40 个新行。是否没有方法可以将滚动条设置为停留在最后添加的项目而不滚动到该项目?问候 我在另一个 therad 中更新了我的 QTableview,并在我的 C++ 代码中使用了ui->tableView_message->scrollToBottom();
,运行一段时间后,应用程序因以下错误而崩溃:ASSERT failure in QCoreApplication::sendEvent: "cannot send events to objects owned by a different thread.
。但如果我总是在第一行插入,它运行良好。任何人都可以给我一个灵感吗?谢谢!【参考方案2】:
据我所知,布局失效在 Qt 视图中有所延迟。所以你不能滚动到某个元素或底部刚刚你添加了数据。您应该使用计时器延迟滚动。这有点脏,但我想出的唯一工作方式
像这样(C++ 代码)
void getData()
addDataToWidget();
QTimer::singleshort(10, widget, SLOT(scrollToBottom());
【讨论】:
@sudobangbang,当您向小部件添加数据时 我正在使用 python,所以对于我的 QTimer 函数,我使用了QtCore.QTimer.singleShot(10,self.tableWidget,QtCore.SLOT(QtGui.QAbstractItemView.scrollToBottom()))
,但我最终得到了这个错误:TypeError: QAbstractItemView.scrollToBottom(): first argument of unbound method must have type 'QAbstractItemView' ...有关如何处理此问题的任何建议?
您必须将 SLOT 参数指定为字符串:QtCore.SLOT('scrollToBottom()')
,或者更好的是,使用新样式的信号槽:QTimer.singleShot(10, self.tablewidget.scrollToBottom)
以上是关于如何在实时数据输入期间将 QTableWidget 设置为始终滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章
如何使用openAL将实时音频输入从麦克风录制到文件中? (里面有C++代码)
如何将数据发送到 QTableView/QTableWidget (PyQt)
如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF