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 аргумент, и я знаю, что прямоугольник, который я передаю, должен покрывать 9 плиток. Что я делаю неправильно?

2

Решение

При создании элементов вы уже установили их непрозрачность на 0, чтобы они не были видны — items () возвращает только видимые элементы, см. http://qt-project.org/doc/qt-4.8/qgraphicsscene.html#items-10:

Возвращает все видимый Предметы …

Установите непрозрачность на значение> 0 в вашем конструкторе, например

newItem->setOpacity(0.001);

При нажатии клавиши пробела появятся четыре элемента в данном прямоугольнике.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]