我有基于C ++ Qt 5.2.1的项目,其中一个图形组件看起来像:
+-- ParentWidget == QScrollArea ----------+
| |^|
| +-- MiddleWidget == QWidget -------+ | |
| | (>) Expand/collapse button | | |
| |----------------------------------| | |
| | | | |
| | +-- ChildWidget ---------------+ | | |
| | | ... | | |0|
| | +------------------------------+ | |0|
| | | |0|
| | +-- ChildWidget ---------------+ | |0|
| | | ... | | |0|
| | +------------------------------+ | |0|
| | | |0|
| | ... | |0|
| +----------------------------------+ |0|
| |0|
| +-- MiddleWidget == QWidget -------+ |0|
| | (>) Expand/collapse button | | |
| |----------------------------------| | |
| | | | |
| | +-- ChildWidget ---------------+ | | |
| | | ... | | | |
| | +------------------------------+ | | |
| | | | |
| | +-- ChildWidget ---------------+ | | |
| | | ... | | | |
+-----------------------------------------+
因此,ParentWidget是QScrollArea,其他是QWidgets。 ParentWidget包含一些MiddleWidgets,MiddleWidget包含一些ChildWidgets。 MiddleWidget也可以展开或折叠 - 折叠时,ChildWidgets不是“可见的”(isVisible()== false)。
当用户向上和向下滚动ParentWidget时,“可见”(isVisible()== true)的ChildWidgets实际上可能在屏幕上不可见。 ChildWidgets包含图片,将所有图片存储在内存中效率不高。所以我想在ChildWidget真正出现在屏幕上并且用户看到它时加载图片;当ChildWidget消失时,图片应存储到文件中并从内存中删除。
现在我可以通过ParentWidget检查这种真正的可见性:
bool ParentWidget::eventFilter(QObject *object, QEvent *event)
{
if (object == widget() && event->type() == QEvent::Paint) {
for (auto middle : _middles) {
for (auto child : middle->childs()) {
if (!child->visibleRegion().isEmpty()) {
...
}
}
}
}
return QScrollArea::eventFilter(object, event);
}
但这种方式显然有其缺点:
所以我的问题是:QWidget可以捕捉到真正的可见性状态吗?如果不是,也许有更有效的方法来实现这种行为?
答案 0 :(得分:2)
QWidget可以自己改变其真实的可见性状态吗?
没有
小部件知道它的唯一真正方法是它何时执行paintEvent
。但是小部件无法知道它真的不可见。
所以我想在什么时候加载图片 ChildWidget确实出现在屏幕上,用户可以看到它;什么时候 ChildWidget消失,图片应存储到文件并删除 来自记忆。
你看过Graphic view framework了吗?它旨在有效地处理大量项目,并且非常快速地完成。
编辑: 我从未使用过它,但有QPixmapCache。您可以在ChildWidget
个实例之间共享缓存,并管理可用的pixmaps限制。
There is a tutorial on how to use a Qpixmap cache.