捕捉QWidget真实可见性状态的变化

时间:2015-01-21 11:49:44

标签: c++ qt visibility qwidget qscrollarea

我有基于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);
}

但这种方式显然有其缺点:

  • ChildWidgets不知道如何更改其真实可见性并依赖于ParentWidget
  • 当ParentWidget的绘制事件发生时,应检查所有ChildWidgets

所以我的问题是:QWidget可以捕捉到真正的可见性状态吗?如果不是,也许有更有效的方法来实现这种行为?

1 个答案:

答案 0 :(得分:2)

  

QWidget可以自己改变其真实的可见性状态吗?

没有

小部件知道它的唯一真正方法是它何时执行paintEvent。但是小部件无法知道它真的不可见。

  

所以我想在什么时候加载图片   ChildWidget确实出现在屏幕上,用户可以看到它;什么时候   ChildWidget消失,图片应存储到文件并删除   来自记忆。

你看过Graphic view framework了吗?它旨在有效地处理大量项目,并且非常快速地完成。

编辑: 我从未使用过它,但有QPixmapCache。您可以在ChildWidget个实例之间共享缓存,并管理可用的pixmaps限制。
There is a tutorial on how to use a Qpixmap cache.