首页| 论坛| 消息

标题:QTableView根据条件隐藏大量数据数据程序无响应情况
作者:weiweiqiao
日期:2021-04-30 18:07
内容:

RT,使用Model/View显示数据(约130W条),在添加数据时,开辟子线程将数据从文件中读取,保存到Model中的QList中,这时候View显示没有卡顿情况,用鼠标拖拽也都正常,没有出现程序无响应情况。
每个数据中都设置标识位(bool)判断是否显示,获取数据所在行的row,通过QTableView的hideRow方法将该行隐藏,根据用户选择条件判断是否显示数据的代码我放在一个子线程中,但是在根据用户条件判断到6w行数据左右,主窗体就开始无响应情况了,运行到所有数据判断完全后,主窗体始终无响应。
不知哪位大神能给下问题的解决思路么?:)


#1 [XChinux 04-30 20:42]
130W条,只是数据吧,数据有多少其实应该是可控的吧,比如分区存放,按需读取。
界面上其实只是显示当前界面及之前、之后的若干条数据就可以了。常规model中中只保留几千条甚至几万条数据就够了吧,不用所有都加载。
#2 回 XChinux 的帖子 [weiweiqiao 05-01 13:53]
XChinux:130W条,只是数据吧,数据有多少其实应该是可控的吧,比如分区存放,按需读取。
界面上其实只是显示当前界面及之前、之后的若干条数据就可以了。常规model中中只保留几千条甚至几万条数据就够了吧,不用所有都加载。 (2021-04-30 20:42) 
感谢你的耐心解答,因工作需要要求每次将所有数据保存到model中,View显示,随后根据条件查询显示符合要求的数据。因为有130w条,一次读取显示大概要30s左右,我考虑将数据通过显示标识位是否进行显示,这样可以在第一次读取文件内容后对model中数据改变较少,节省时间。按你的说法,那我还是最好每次根据选择条件重新读取数据了。
另:还有个问题想问下,Model/View的Model在加载数据时是不能够放到子线程中么?我刚开始想将Model通过变量QList加载数据和从文件中读取数据两个操作都放在不同的子线程中,但是我发现Model放在子线程中会导致UI界面卡死,如果只是将读取文件数据放到子线程中就不会卡UI
#3 [snow_man_0 05-02 11:36]
可以重写QTableView的滚动条的放下事件,Table里只显示部分数据。这样不需要做多线程,也不会卡
#4 [XChinux 05-03 10:38]
将model这儿自己重写下,按需加载数据。
比较明显的像QSqlTableModel/QSqlQueryModel,它不不是一次性将所有数据都查出来,而是随着滚动条的下拉按需查询数据加载的。
#5 回 snow_man_0 的帖子 [weiweiqiao 05-03 13:47]
snow_man_0:可以重写QTableView的滚动条的放下事件,Table里只显示部分数据。这样不需要做多线程,也不会卡 (2021-05-02 11:36) 
谢谢,我试试。

<< 1 2 3 >> (1/3)

回复 发表
主题 版块