【发布时间】:2015-01-21 11:49:43
【问题描述】:
我有基于 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 包含一些 MiddleWidget,MiddleWidget 包含一些 ChildWidget。 MiddleWidget 也可以展开或折叠 - 折叠时,ChildWidgets 不“可见”(isVisible() == false)。
当用户上下滚动 ParentWidget 时,“可见”的 ChildWidgets (isVisible() == true) 实际上可能在屏幕上不可见。 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事件发生时,所有的ChildWidgets都应该被检查
所以我的问题是:QWidget 可以捕捉到改变其真实可见性状态本身吗?如果不是,也许有更有效的方法来实现这种行为?
【问题讨论】:
-
it's inefficiently to store all pictures in memory。你如何储存它们? -
ChildWidget 有 QPixmap 字段
-
足够好...像素图是否已经预先调整大小?请注意,隐藏小部件的绘制事件的缺失来自您面临的相同问题:一般来说,您不希望将 CPU 浪费在无论如何都隐藏的小部件上。
-
是的,所有像素图都已预先调整大小。主要问题是我不能说将创建多少个 ChildWidget。在某些情况下,我看到它可以达到 200-300 个实例,这不是限制。因此,最好浪费 cpu 时间,而不是达到操作系统内存限制并导致应用程序故障。我只是认为可能有一些肮脏的深层 QWidget 秘密可以让我捕捉到最后的绘画事件或其他东西 :) 但是非常感谢您的回答!
-
你看到我的编辑了吗?
QPixmapCache允许您为所有这些像素图使用共享缓存。我其实很期待自己使用它。
标签: c++ qt visibility qwidget qscrollarea