QTableView显示较多数据的时候鼠标移进后会大量调用rowcount()导致卡顿

lzlz365 2012-02-07 10:34:51
model里的数据有2000行
在鼠标进入TableView后,model的rowcount函数被调用了230W次,以至于这段期间内程序无法处理鼠标的其他事件,出现卡顿现象。
行数和rowcount的调用次数关系大致如下:
行数 调用次数
10 60
30 470
100 5000
500 12W
2100 230W
这些调用是出现在2次viewportEvent之间的
鼠标只要在TableView中停下来,就会出现这个问题。如果鼠标在TableView中移动但最后移到TableView范围外,就不会触发这个问题。
有人知道这是什么原因造成的吗?要如何解决这个问题?
...全文
738 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiachm 2012-02-11
  • 打赏
  • 举报
回复
越界的内存访问就是这种现象,时好时坏,因为它是否异常完全取决于越界区当时的值。楼主还是检查自己代码吧。如果你还不确定,最简单的办法,编译一下Qt的demo,如果我没记错,里面是有模型视图结构的例子的。如果有它也有问题,就真没辙了。
lzlz365 2012-02-11
  • 打赏
  • 举报
回复
但是问题是同样的代码使用不同的库,一个卡(我的电脑上的库)一个不卡(别人电脑上的库)。
我觉得这样一来应该可以排除代码的问题。而且使用的是Qt提供的View-Model结构的类,没有引入我自己的修改,应该也不会有问题的。。
最大的问题在于为什么我的电脑上的dll和别人电脑上的会不一样。。
为什么我的电脑上的dll会导致rowcount被大量调用(实际上是model中的index被大量调用,而每个index至少会调用一次rowcount)。
xiachm 2012-02-10
  • 打赏
  • 举报
回复
代码有指针操作错误或越界时往往就会出现这种现象。楼主最好再检查一下自己的代码,看看有没有野指针或是变量越界的问题。
lzlz365 2012-02-10
  • 打赏
  • 举报
回复
那位朋友说他是通过qt自带的工具升级到4.8的。具体我也不清楚。
为了编译出能使用那位朋友的dll库的程序,我特意选的mingw的编译器。
用的就是Qt/4.8/mingw/bin/下的库。
和版本更新似乎没关系。。因为用我的电脑上的4.8版本的库也会卡。。

不过通过使用哪位朋友的库,我倒是也可以避开这个问题。
虽然总觉得只有自己的电脑上(我的XP系统的台式机和WIN7系统的笔记本上编译出来的都卡)的库有问题很奇怪。。
cddark 2012-02-09
  • 打赏
  • 举报
回复
除了版本不同,编译器相同么?
都是用官方提供的二进制包安装的么,还是自己编译的Qt/其他途径获取的?

还有一般工程用的dll是Qt/$VERSION/bin/ 下面的,
所以发布的时候最好用 Qt/$VERSION/bin/ 下面的dll,不要用creator/bin 下面的。两个不一定一致。

不过一个小版本更新不应该导致这种问题。。
具体也不清楚了。。
cddark 2012-02-08
  • 打赏
  • 举报
回复
猜测:你mouseMove的时候做了复杂操作。
正常情况下,view是不会频繁访问rowCount的。
lovemyliwu 2012-02-08
  • 打赏
  • 举报
回复
model的rowcount函数是干神马的?
lzlz365 2012-02-08
  • 打赏
  • 举报
回复
发现一个很奇怪的现象。
热心的朋友发给我他编译的exe文件和他的库,然后程序在我的电脑上能正常运行,也不会卡。
而我编译的exe程序,如果用他发过来的那个库,竟然也不会卡。
但是如果用我自己电脑上的库,就会卡。甚至是朋友编译的exe程序用我的库也会卡。
有趣的是。我用了QSqlQueryModel,使用SQLite这个数据库,按理说需要建一个sqldrivers文件夹,把qsqlite4.dll放进去,但如果用我的库,却不需要这个文件夹就能使用正常读取数据库(忽略会卡这个不正常的现象)。

我的库和朋友的库都是QtCreater自带的库,为什么会有这种现象?
xiachm 2012-02-08
  • 打赏
  • 举报
回复
很显然,你的代码有问题。
cddark 2012-02-08
  • 打赏
  • 举报
回复
我用的就是4.7.4 ……这么严重的问题这么会被当做bug遗留着……
还是检查一下程序吧。
lzlz365 2012-02-08
  • 打赏
  • 举报
回复
刚刚一位热心的朋友帮我看了下,结果在他的电脑上是不卡的。
然后他把他编译好的release版本的程序发给我,那个程序在我的电脑上也不卡。
他的库是4.8.0的而我的是4.7.4。
这样一来很可能是旧版的库有BUG导致的!而这个问题在新版的库里被修复了。我正在更新QtSDK,更新好后看看还有没有这个问题。
cddark 2012-02-08
  • 打赏
  • 举报
回复

QTableView *view = new QTableView();
QSqlQueryModel *model = new QSqlQueryModel();
model->setQuery(QString("SELECT * FROM table;"));
view->setModel(model);
// view->setSortingEnabled(true);
view->show();

table里有1万行都不会卡……

你看看有没有其他线程影响界面
lzlz365 2012-02-08
  • 打赏
  • 举报
回复
补充一句,把上面的代码中的myTableView替换为QTableView,mySqlQueryModel替换为QSqlQueryModel一样会卡。
lzlz365 2012-02-08
  • 打赏
  • 举报
回复
model是QSqlQueryModel
不仅model的rowcount()被大量访问
model的index()也被同样量级地被访问。
而如果我强制model的index返回QModelIndex()
则model的index在这个过程中只会被访问一次,而rowCount()不会被访问到。
但同时View里面就显示不了数据了。。
myTableView*view = new myTableView;
mySqlQueryModel* model = new mySqlQueryModel(view);
model->setQuery(QString("SELECT * FROM file;"));
view->setModel(model);
// view->setSortingEnabled(true);
view->show();

仅仅是这种最简单的情况也会出现这个问题。(myTableView和mySqlQueryModel仅仅是在QTableView和QSqlQueryModel上的部分函数外面加上一层统计被调用次数的函数。)

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧