Qt QLabel的视频内存使用和QWidget::hide()的效果

Qt QLabel的视频内存使用和QWidget::hide()的效果,qt,video-memory,Qt,Video Memory,我正在编写一个应用程序,可能会有成千上万个标签(某种类型的日志查看应用程序),其中大部分都是用QWidget::hide()隐藏的。我想象QLabel在创建时会占用一些视频内存。现在,hide()是否释放了视频内存?或者我必须QWidget::remove()大多数隐藏标签才能将视频内存使用保持在合理水平吗?一般来说,大多数小部件不会将预渲染图像存储在内存中。相反,它们在失效后按需呈现。但是,如果渲染非常耗时,有些人会这样做。查看QLabel源代码(),似乎QLabel在启用scaledCont

我正在编写一个应用程序,可能会有成千上万个标签(某种类型的日志查看应用程序),其中大部分都是用QWidget::hide()隐藏的。我想象QLabel在创建时会占用一些视频内存。现在,hide()是否释放了视频内存?或者我必须QWidget::remove()大多数隐藏标签才能将视频内存使用保持在合理水平吗?

一般来说,大多数小部件不会将预渲染图像存储在内存中。相反,它们在失效后按需呈现。但是,如果渲染非常耗时,有些人会这样做。查看QLabel源代码(),似乎QLabel在启用scaledContents并且需要进行缩放时会缓存其pixmap。纯文本标签按原样绘制,没有任何缓存


尽管如此,正如@G.M所提到的,每个小部件都会消耗一些系统内存来存储自己的数据,并且由于事件处理而需要处理时间,因此生成10k标签是一种合理的资源浪费。相反,项目视图是在其表面上绘制项目的单个小部件。没有事件处理开销,没有不必要的缓存。与QLabel一样,项视图项也可以完全设置样式,有关详细信息,请参见。更复杂的是,使用QItemDelegate可以实现多行列表项:

通常,大多数小部件都不会将其预渲染的图像存储在内存中。相反,它们在失效后按需呈现。但是,如果渲染非常耗时,有些人会这样做。查看QLabel源代码(),似乎QLabel在启用scaledContents并且需要进行缩放时会缓存其pixmap。纯文本标签按原样绘制,没有任何缓存


尽管如此,正如@G.M所提到的,每个小部件都会消耗一些系统内存来存储自己的数据,并且由于事件处理而需要处理时间,因此生成10k标签是一种合理的资源浪费。相反,项目视图是在其表面上绘制项目的单个小部件。没有事件处理开销,没有不必要的缓存。与QLabel一样,项视图项也可以完全设置样式,有关详细信息,请参见。更复杂的是,使用QItemDelegate可以实现多行列表项:

如果您使用了
QLabel
只需将其删除即可。你为什么要把它藏起来?你想晚一点再看吗?@Simon我想晚一点再看一些(不过我不知道是哪一个)。因此,如果我删除一个标签,以后可能需要再次创建/定位它。您是否考虑过将QListView与自定义委托一起使用,而不是使用标签?列表视图保证只绘制可见的项目,并为您定位和滚动。这只是一个意见,但是,使用成千上万的
QLabel
s(假设这就是tou的意思)来实现这一点不是一个好主意。如果您确实需要那个数量的不同的视觉实体,那么您可能需要查看。不过,您提到了一个日志查看应用程序,在这种情况下,模型/视图框架可能更合适。@AlexanderZavertan感谢您提到它。QListView有很多功能,但似乎有些功能很难根据我的想法进行定制。此外,我不知道它如何处理视频内存问题。它是否有一个特殊的自动机制来删除远离视频内存的行?如果您使用
QLabel
只需删除它即可。你为什么要把它藏起来?你想晚一点再看吗?@Simon我想晚一点再看一些(不过我不知道是哪一个)。因此,如果我删除一个标签,以后可能需要再次创建/定位它。您是否考虑过将QListView与自定义委托一起使用,而不是使用标签?列表视图保证只绘制可见的项目,并为您定位和滚动。这只是一个意见,但是,使用成千上万的
QLabel
s(假设这就是tou的意思)来实现这一点不是一个好主意。如果您确实需要那个数量的不同的视觉实体,那么您可能需要查看。不过,您提到了一个日志查看应用程序,在这种情况下,模型/视图框架可能更合适。@AlexanderZavertan感谢您提到它。QListView有很多功能,但似乎有些功能很难根据我的想法进行定制。此外,我不知道它如何处理视频内存问题。它是否有一个特殊的自动机制来移除远离视频内存的行?