QLabel 的显存占用和 QWidget::hide() 的效果
Video memory usage of QLabel and the effects of QWidget::hide()
我正在编写一个应用程序,可能会有数万个标签(某种日志查看应用程序),其中大部分隐藏在 QWidget::hide() 中。我想象一个 QLabel 在创建时会占用一些视频内存。现在,hide() 会释放那个显存吗?还是我必须 QWidget::remove() 大多数隐藏标签才能将显存使用量保持在合理水平?
一般来说,大多数小部件不会将它们的预渲染图像存储在内存中。相反,它们在失效后按需呈现。但是,如果渲染很耗时,有些人会这样做。查看 QLabel 源代码 (http://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qlabel.cpp),似乎 QLabel 在启用 scaledContents 并且需要缩放时缓存其像素图。纯文本标签按原样绘制,没有任何缓存。
不过,正如@G.M 提到的,每个小部件都会消耗一些系统内存来存储自己的数据,以及由于事件处理而产生的处理时间,因此产生 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 for details. More complex looks like multi-line list items are achievable with QItemDelegate: Qt QListWidgetItem Multiple Lines
我正在编写一个应用程序,可能会有数万个标签(某种日志查看应用程序),其中大部分隐藏在 QWidget::hide() 中。我想象一个 QLabel 在创建时会占用一些视频内存。现在,hide() 会释放那个显存吗?还是我必须 QWidget::remove() 大多数隐藏标签才能将显存使用量保持在合理水平?
一般来说,大多数小部件不会将它们的预渲染图像存储在内存中。相反,它们在失效后按需呈现。但是,如果渲染很耗时,有些人会这样做。查看 QLabel 源代码 (http://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qlabel.cpp),似乎 QLabel 在启用 scaledContents 并且需要缩放时缓存其像素图。纯文本标签按原样绘制,没有任何缓存。
不过,正如@G.M 提到的,每个小部件都会消耗一些系统内存来存储自己的数据,以及由于事件处理而产生的处理时间,因此产生 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 for details. More complex looks like multi-line list items are achievable with QItemDelegate: Qt QListWidgetItem Multiple Lines