c++ - 捕捉 QWidget 真实可见性状态变化

标签 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 也可以展开或折叠 - 折叠时,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/

相关文章:

C++使用备用字母加密句子(字符数组)(可能重复)

c++ - QPalette 不适用于子 QWidget

python - 获取 Qt 中的输出 : 'QProcess::start()' and 'QProcess:readAllStandardOutPut()'

javascript - document.getElementById ("remember").visibility = "hidden";不在复选框上工作

c++ - 外部日志文件为 UTF8 并带有\r\n

c++ - 重载元组索引运算符 - C++

visual-studio-2010 - Qt MinGW WIN32 到 Visual Studio 2010

c# - 为什么 UserControl 中的 Visible 属性没有正确更新?

css - FBML,连接可见,否则,额外的空白

c++ - 我应该将 "bind" "spinning"线程连接到某个核心吗?