我有C++的Qt 5.2.1基於項目和圖形組成的一個樣子:抓QWidget的真實可見性狀態改變
+-- 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可以捕捉它自己的真實可見性狀態嗎?如果不是,也許有更有效的方法來實現這種行爲?
'將所有圖片存儲在內存中效率低下'。你如何儲存它們? – UmNyobe 2015-01-21 13:02:54
ChildWidget有QPixmap字段 – 2015-01-21 14:21:58
夠好...像素圖是否已經預先調整大小?請注意,隱藏小部件的paintevent缺失來自您面臨的同一問題:一般而言,您不希望將cpu浪費在隱藏的小部件上。 – UmNyobe 2015-01-21 17:12:49