小编Sub*_*iro的帖子

第一次填充QTableWidget时,一切都很好,但是当我重新填充它时,速度明显变慢

代码:

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表而没有所有这些问题?如果没有,有没有办法解决这些问题?

c++ qt qtablewidget qtablewidgetitem

4
推荐指数
1
解决办法
3961
查看次数

哪个在Qt中更有效:带有参数的构造函数或之后带有setter的默认构造函数?

问题与标题中的一样.

例如:

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的指导建议.

c++ setter constructor object-construction

2
推荐指数
1
解决办法
3979
查看次数

我如何接收或能够在我的小部件窗口外处理 mouseMoveEvent(s)?

我正在编写 Qt 应用程序,它在鼠标移动到屏幕上的某个区域时播放淡入动画,每当鼠标移出同一区域时播放淡出动画。

我已经在堆栈溢出中找到了一个类似的问题,但是,它并不能完全回答我的问题。(类似的问题在这里

如果我为应用程序安装了事件过滤器,我是否能够看到应用程序中的所有事件,即使它在我的小部件窗口之外?

如果没有,我知道在 leaveEvent() 的重新实现中涉及 QWidget::grabMouse() 的替代方法。但是,如果我这样做,我是否能够与应用程序之外的任何内容进行交互?

编辑:虽然我使用的是 Qt 库,但我的应用程序仅用于部署到 Windows。

c++ mouse events qt

1
推荐指数
1
解决办法
1559
查看次数

哪种内存更有效:静态函数,或者立即删除的对象的函数?

标题所说的问题是静态函数?或者立即删除的对象的功能?

我知道在实际情况下,差异是完全不可察觉的,但我仍然想知道哪种更有效地节省内存.我真的不介意"新"和"删除"命令给出的开销.

MyClass::staticFunction();
Run Code Online (Sandbox Code Playgroud)

要么...

myObject = new MyClass;
myObject->normalFunction();
delete myObject;
Run Code Online (Sandbox Code Playgroud)

编辑:第二个代码也可能是MyClass().normalFunction();愚蠢的......

这里有一些事情需要考虑;

  1. 只有一个myObject实例,它只在应用程序中使用ONCE.
  2. 使用后,它会立即删除,因为它不需要.
  3. 有人会问,为什么这甚至在课堂上呢?为什么不把函数放在临时变量使用的位置呢?答案是封装和可读性.我相信静态函数使用与全局函数相同的资源,因为事实上,它们实际上是享受类范围的全局函数.我必须把它放在它自己的类中的唯一原因是使我的代码更具可读性和封装性.

c++ function

1
推荐指数
1
解决办法
209
查看次数