2015-01-21 31 views
2

我有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可以捕捉它自己的真實可見性狀態嗎?如果不是,也許有更有效的方法來實現這種行爲?

+0

'將所有圖片存儲在內存中效率低下'。你如何儲存它們? – UmNyobe 2015-01-21 13:02:54

+0

ChildWidget有QPixmap字段 – 2015-01-21 14:21:58

+0

夠好...像素圖是否已經預先調整大小?請注意,隱藏小部件的paintevent缺失來自您面臨的同一問題:一般而言,您不希望將cpu浪費在隱藏的小部件上。 – UmNyobe 2015-01-21 17:12:49

回答

2

QWidget是否可以改變它的真實可見性狀態本身?

一個小部件需要知道的唯一途徑,它是可見的是,當它執行paintEvent。但小部件無法知道它真的不可見。

所以我想加載圖片時 ChildWidget真的出現在屏幕上,用戶看到它;當 ChildWidget消失時,應將圖片存儲到文件中並從內存中刪除 。

您是否看過Graphic view framework?它旨在有效處理大量物品,並且速度非常快。

編輯:我從來沒有使用它,但有QPixmapCache。您可以在ChildWidget實例之間共享緩存,並管理可用pixmap的限制。
There is a tutorial on how to use a Qpixmap cache.

+0

謝謝你的回答。太糟糕了:( 我不能使用QGraphicsView作爲應用程序是完全基於小部件的; ChildWidgets應該像QWidgets一樣行事。 – 2015-01-21 14:19:01