代码:
populateTable()
{
tableWidget->clearContents();
tableWidget->setRowCount(stringList.size());
for(int i = 0; i < stringList.size(); ++i)
{
tableWidget->setItem(i, 0, new QTableWidgetItem(stringList.at(i)));
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
第一次运行populateTable(),一切都很好.但接下来的一段时间,它的运行速度明显慢于以前.
讨论:
仔细测试后,我怀疑clearContents()是问题所在.因为只需更改代码
tableWidget->clearContents();
Run Code Online (Sandbox Code Playgroud)
至:
tableWidget->setRowCount(0);
Run Code Online (Sandbox Code Playgroud)
解决问题,但现在又出现了另一个问题; 将行计数设置为'0'似乎不会删除堆分配的QTableWidgetItems,它似乎只是保留了项目的所有权,因此它会留下内存泄漏.(或者至少我只是这么认为......)
Qt在QTableWidget中的文档相当模糊,所以我并不确切知道clearContents()实际上做了什么.在文档中,它说"从视图中删除不在标题中的所有项目",这样我就会问,表中的内容是否只是隐藏?它会被删除吗?我不太确定.我的理论是clearContents()只隐藏项目,任何下一次填充表的尝试实际上删除并删除每个项目然后分配一个新的项目来设置在表格上,这反过来又是一项昂贵的操作.
另一件有趣的事情是Qt关于QTableWidget的文档表明填充QTableWidget的正确方法是在堆上分配一个QTableWidgetItem,然后将其设置在一个带有setItem()的表格单元格上,就像我在上面的代码中看到的那样,我发现它是奇怪...
综上所述:
是否有另一种方法来填充和重新填充Qt表而没有所有这些问题?如果没有,有没有办法解决这些问题?
问题与标题中的一样.
例如:
QPropertyAnimation *animation;
animation = new QPropertyAnimation(this, "windowOpacity", this);
Run Code Online (Sandbox Code Playgroud)
要么
QPropertyAnimation animation;
animation.setTargetObject(this);
animation.setPropertyName("windowOpacity");
animation.setParent(this);
Run Code Online (Sandbox Code Playgroud)
哪个更有效率?
编辑:虽然它没有显着差异,除非反复进行,我仍然想知道,我宁愿想要答案而不是意见 - 如stackoverflow的指导建议.
我正在编写 Qt 应用程序,它在鼠标移动到屏幕上的某个区域时播放淡入动画,每当鼠标移出同一区域时播放淡出动画。
我已经在堆栈溢出中找到了一个类似的问题,但是,它并不能完全回答我的问题。(类似的问题在这里)
如果我为应用程序安装了事件过滤器,我是否能够看到应用程序中的所有事件,即使它在我的小部件窗口之外?
如果没有,我知道在 leaveEvent() 的重新实现中涉及 QWidget::grabMouse() 的替代方法。但是,如果我这样做,我是否能够与应用程序之外的任何内容进行交互?
编辑:虽然我使用的是 Qt 库,但我的应用程序仅用于部署到 Windows。
标题所说的问题是静态函数?或者立即删除的对象的功能?
我知道在实际情况下,差异是完全不可察觉的,但我仍然想知道哪种更有效地节省内存.我真的不介意"新"和"删除"命令给出的开销.
MyClass::staticFunction();
Run Code Online (Sandbox Code Playgroud)
要么...
myObject = new MyClass;
myObject->normalFunction();
delete myObject;
Run Code Online (Sandbox Code Playgroud)
编辑:第二个代码也可能是MyClass().normalFunction();愚蠢的......
这里有一些事情需要考虑;