• 2226阅读
  • 12回复

[提问]QTableView根据条件隐藏大量数据数据程序无响应情况 [复制链接]

上一主题 下一主题
离线weiweiqiao
 

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

只看该作者 1楼 发表于: 2021-04-30
130W条,只是数据吧,数据有多少其实应该是可控的吧,比如分区存放,按需读取。

界面上其实只是显示当前界面及之前、之后的若干条数据就可以了。常规model中中只保留几千条甚至几万条数据就够了吧,不用所有都加载。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线weiweiqiao

只看该作者 2楼 发表于: 2021-05-01
回 XChinux 的帖子
XChinux:130W条,只是数据吧,数据有多少其实应该是可控的吧,比如分区存放,按需读取。
界面上其实只是显示当前界面及之前、之后的若干条数据就可以了。常规model中中只保留几千条甚至几万条数据就够了吧,不用所有都加载。 (2021-04-30 20:42) 

感谢你的耐心解答,因工作需要要求每次将所有数据保存到model中,View显示,随后根据条件查询显示符合要求的数据。因为有130w条,一次读取显示大概要30s左右,我考虑将数据通过显示标识位是否进行显示,这样可以在第一次读取文件内容后对model中数据改变较少,节省时间。按你的说法,那我还是最好每次根据选择条件重新读取数据了。

另:还有个问题想问下,Model/View的Model在加载数据时是不能够放到子线程中么?我刚开始想将Model通过变量QList加载数据和从文件中读取数据两个操作都放在不同的子线程中,但是我发现Model放在子线程中会导致UI界面卡死,如果只是将读取文件数据放到子线程中就不会卡UI
Jobs Insanely Great.
离线snow_man_0

只看该作者 3楼 发表于: 2021-05-02
可以重写QTableView的滚动条的放下事件,Table里只显示部分数据。这样不需要做多线程,也不会卡
离线XChinux

只看该作者 4楼 发表于: 2021-05-03
将model这儿自己重写下,按需加载数据。
比较明显的像QSqlTableModel/QSqlQueryModel,它不不是一次性将所有数据都查出来,而是随着滚动条的下拉按需查询数据加载的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线weiweiqiao

只看该作者 5楼 发表于: 2021-05-03
回 snow_man_0 的帖子
snow_man_0:可以重写QTableView的滚动条的放下事件,Table里只显示部分数据。这样不需要做多线程,也不会卡 (2021-05-02 11:36) 

谢谢,我试试。
Jobs Insanely Great.
离线weiweiqiao

只看该作者 6楼 发表于: 2021-05-03
回 XChinux 的帖子
XChinux:将model这儿自己重写下,按需加载数据。
比较明显的像QSqlTableModel/QSqlQueryModel,它不不是一次性将所有数据都查出来,而是随着滚动条的下拉按需查询数据加载的。 (2021-05-03 10:38) 

谢谢,我试试。
Jobs Insanely Great.
离线deepgui

只看该作者 7楼 发表于: 2021-05-08
数据可以存在一个queue里,一点点加。不显示的可以删除。全加进去浪费资源。
离线clickto

只看该作者 8楼 发表于: 2021-05-08
楼主,既然这样,你为什么不在数据库中就直接添加一个是否显示的字段,然后生成model的时候设置一个filter,这样直接就完事了,不需要显示的记录就自动的不在model中了
离线weiweiqiao

只看该作者 9楼 发表于: 2021-05-14
回 deepgui 的帖子
deepgui:数据可以存在一个queue里,一点点加。不显示的可以删除。全加进去浪费资源。 (2021-05-08 11:37) 

你好,我因为要比较全部数据和条件选择数据的情况,所以在一开始是全部读取的。我最后用2个QList解决的,一个在全部加载时将所有数据保存,1个作为与View绑定的List,将符合条件的数据从保存List拷贝过来,方法笨,但是还行,110W条数据的查询还是很快的。
Jobs Insanely Great.
离线weiweiqiao

只看该作者 10楼 发表于: 2021-05-14
回 clickto 的帖子
clickto:楼主,既然这样,你为什么不在数据库中就直接添加一个是否显示的字段,然后生成model的时候设置一个filter,这样直接就完事了,不需要显示的记录就自动的不在model中了 (2021-05-08 23:33) 

我是从日志文件读取数据,不是数据库,文件为.txt
Jobs Insanely Great.
离线clickto

只看该作者 11楼 发表于: 2021-05-15
我的意思是,不论你的数据来源是什么,关于是否显示的处理在生成model之前就完成了,保证model里存储的只是需要显示的内容,这样不用在界面(view)里进行大量的处理,不会卡界面了。
离线weiweiqiao

只看该作者 12楼 发表于: 2021-05-20
回 clickto 的帖子
clickto:我的意思是,不论你的数据来源是什么,关于是否显示的处理在生成model之前就完成了,保证model里存储的只是需要显示的内容,这样不用在界面(view)里进行大量的处理,不会卡界面了。 (2021-05-15 19:31) 

OK,明白了,我后面再试试。
Jobs Insanely Great.
快速回复
限100 字节
 
上一个 下一个