代码:
populateTable()
{
tableWidget->clearContents();
tableWidget->setRowCount(stringList.size());
for(int i = 0; i < stringList.size(); ++i)
{
tableWidget->setItem(i, 0, new QTableWidgetItem(stringList.at(i)));
}
}
问题:
第一次运行 populateTable() 时,一切正常。但是接下来的时间,它的运行速度明显比以前慢。
讨论:
经过仔细测试后,我怀疑 clearContents() 是问题所在。因为简单地改变代码从
tableWidget->clearContents();
到:
tableWidget->setRowCount(0);
解决了这个问题,但现在又产生了另一个问题;将行计数设置为“0”似乎并没有删除分配给堆的 QTableWidgetItems,它似乎只是留下了项目的所有权,所以它留下了内存泄漏。 (或者至少我只是这么认为...)
Qt 在 QTableWidget 中的文档相当模糊,所以我不完全知道 clearContents() 到底做了什么。在文档中它说“从 View 中删除所有不在标题中的项目”所以我问,表格的内容只是隐藏了吗?它会被删除吗?我不太确定。我的理论是 clearContents() 仅隐藏项目,任何下一次填充表的尝试实际上会删除和删除每个项目,然后分配一个新项目以设置在表上,这反过来又是一项昂贵的操作。
另一个有趣的事情是,Qt 关于 QTableWidget 的文档建议填充 QTableWidget 的正确方法是在堆上分配一个 QTableWidgetItem,然后使用 setItem() 将它设置在一个表单元格上,就像我在上面的代码中介绍的那样,我发现很奇怪...
总结:
是否有替代方法来填充和重新填充 Qt 表而不会出现所有这些问题?如果没有,是否有解决这些问题的方法?
最佳答案
“Qt 关于 QTableWidget 的文档建议填充 QTableWidget 的正确方法是在堆上分配 QTableWidgetItem,然后使用 setItem() 将其设置在表格单元格上,就像我在上面的代码中介绍的那样,我发现变得很奇怪……”
考虑到 documentation for QTableWidget::setItem,我并不觉得这很奇怪明确表示小部件拥有该项目的所有权!
“将行计数设置为‘0’似乎并没有删除堆分配的 QTableWidgetItems,它似乎只是留下了项目的所有权,所以它留下了内存泄漏。(或者至少我只是这么认为...)”
与其猜测它是否泄漏,您可以创建自己的 QTableWidgetItem 子类...并将代码放入其析构函数中,以便您可以放置断点并确定。或者,Qt 源代码非常清晰。 setRowCount 调用 removeRows,它确实删除了 QTableWidgetItems:
http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/itemviews/qtablewidget.cpp#line370
http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/itemviews/qtablewidget.cpp#line100
但这再次与 documentation for QTableWidget::setRowCount 一致
Sets the number of rows in this model to rows. If this is less than rowCount(), the data in the unwanted rows is discarded.
您真的不应该看到 clearContents() 和 setRowCount(0) 之间有太大区别。您是否生成了一个可重现的小示例,而不是缠绕在任何更大的程序中,以证明这种现象?
关于c++ - 第一次填充 QTableWidget 时,一切都很好,但是当我重新填充它时,速度明显变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10192579/
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: