2

特定のエリア内のすべてのアイテムを選択して、不透明度を変更したいのですが。私は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タイルをカバーするべきであることを知っています。私は何が間違っているのですか?

4

1 に答える 1

2

アイテムを作成するときは、不透明度を0に設定して、アイテムが表示されないようにします。items()は、表示されているアイテムのみを返します。http: //qt-project.org/doc/qt-4.8/qgraphicsscene.html#items-を参照してください。 10

表示されているすべてのアイテムを返します...

コンストラクターで不透明度を0より大きい値に設定します。例:

newItem->setOpacity(0.001);

スペースバーを押すと、指定された長方形の4つのアイテムが表示されます。

于 2012-09-06T20:22:28.193 に答える