2012-09-06 69 views
2

我想選擇某個區域內的所有項目並更改其不透明度。我使用QGraphicsScene::items()來做到這一點,但我似乎無法讓它返回任何項目。舉個例子:QGraphicsScene :: items不會返回給定矩形的任何項目

#include "MainWindow.h" 
#include "ui_MainWindow.h" 

#include <QDebug> 
#include <QKeyEvent> 
#include <QGraphicsPixmapItem> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
    , scene(new QGraphicsScene()) 
{ 
    ui->setupUi(this); 

    ui->graphicsView->setScene(scene); 
    ui->graphicsView->installEventFilter(this); 
    ui->graphicsView->show(); 

    for (int y = 0; y < 20; ++y) { 
     for (int x = 0; x < 20; ++x) { 
      QPixmap pixmap("desert.png"); 
      QGraphicsPixmapItem* newItem(scene->addPixmap(pixmap)); 
      newItem->setPos(x * 25, y * 25); 
      newItem->setOpacity(0.0); 
      qDebug() << newItem; 
     } 
    } 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
    delete scene; 
} 

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if(event->type() == QEvent::KeyPress) { 
     QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); 
     if (keyEvent->key() == Qt::Key_Space) { 
      QRectF rect(0, 0, 25 * 3, 25 * 3); 
      QList<QGraphicsItem*> items(scene->items(rect, Qt::ContainsItemBoundingRect, Qt::AscendingOrder)); 
      qDebug() << items; 
      foreach (QGraphicsItem *item, items) { 
       item->setOpacity(1.0); 
      } 
     } 
     return true; 
    } 
    return QObject::eventFilter(obj, event); 
} 

我敢肯定,我並不需要提供deviceTransform說法,而且我知道我傳入RECT應涵蓋9瓦。我究竟做錯了什麼?

回答

2

在創建項目,您已經設置不透明度爲0,因此他們是不可見的 - 項()返回唯一可見的物品,看http://qt-project.org/doc/qt-4.8/qgraphicsscene.html#items-10

返回所有可見項目...

在您的構造函數中將不透明度設置爲大於0的值,例如

newItem->setOpacity(0.001); 

當現在按空格鍵時,給定矩形中的四個項目將出現。

+1

謝謝安德烈亞斯。這僅僅是我還是這個沒有解釋的地方?從鏈接中我可以看到它提到了「所有可見項目」,但可見的定義似乎包含透明項目。 – Mitch

+0

我還沒有進一步檢查 - 也許這是QGraphicsScene中的一個優化,它假設完全透明的項目根據定義是不可見的... –

+0

文檔(5.0)將會很快更新並進行澄清。 – Mitch

相關問題