我正在编写一个应用程序,可能会有数以万计的标签(一种日志查看应用程序),其中大部分隐藏在 QWidget::hide() 中。我想象一个 QLabel 在创建时会占用一些视频内存。现在, hide() 是否释放了视频内存?还是我必须 QWidget::remove() 大部分隐藏标签才能将视频内存使用率保持在合理水平?
1 回答
通常,大多数小部件不会将其预渲染图像存储在内存中。相反,它们在失效后按需渲染。但是,如果渲染很耗时,有些人会这样做。查看了 QLabel 源代码(http://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qlabel.cpp),似乎 QLabel 在启用 scaledContents 时缓存了它的像素图并且缩放是必要的。纯文本标签按原样绘制,没有任何缓存。
尽管如此,正如@GM 所提到的,每个小部件都会消耗一些系统内存来存储自己的数据,并且由于事件处理而需要处理时间,因此产生 10k 个标签是合理的资源浪费。相比之下,项目视图是在其表面上绘制项目的单个小部件。没有事件处理开销,没有不必要的缓存。与 QLabels 一样,项目视图项目的样式也很完美,请参阅http://doc.qt.io/archives/qt-5.8/stylesheet-examples.html#customizing-qlistview、http://doc.qt.io/archives/qt -5.8/stylesheet-examples.html#customizing-qtreeview了解详情。使用 QItemDelegate 可以实现更复杂的外观,例如多行列表项:Qt QListWidgetItem Multiple Lines