我有基于 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 也可以展开或折叠 - 折叠时,ChildWidget 不“可见”(isVisible() == false)。
当用户上下滚动 ParentWidget 时,“可见”(isVisible() == true) 的 ChildWidget 实际上可能在屏幕上并不真正可见。 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);
}
但是这种方式显然也有缺点:
- ChildWidgets 不知道如何改变它们的真实可见性并依赖于 ParentWidget
- 当 ParentWidget 的 paint 事件发生时,所有的 ChildWidget 都应该被检查
所以我的问题是:QWidget 能否捕捉到其真实可见性状态本身的变化?如果不是,也许有更有效的方法来实现此类行为?
最佳答案
can QWidget catch changing its real visibility state itself?
没有。
小部件知道它可见的唯一真实方法是在它执行 paintEvent
时。但是小部件无法知道它真的不可见。
So i want to load picture when ChildWidget is really appears on screen and user sees it; when ChildWidget disappears, picture should be stored to file and erased from memory.
你看过Graphic view framework了吗? ?它旨在高效处理大量项目,并且处理速度非常快。
编辑: 我没用过,但是有QPixmapCache .您可以在 ChildWidget
实例之间共享缓存并管理可用像素图的限制。
There is a tutorial on how to use a Qpixmap cache.
关于c++ - 捕捉 QWidget 真实可见性状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28066542/