【问题标题】:QGraphicsScene::items returns no items for a given rectQGraphicsScene::items 不返回给定矩形的项目
【发布时间】:2012-09-07 04:37:13
【问题描述】:

我想选择某个区域内的所有项目并更改它们的不透明度。我正在使用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 个图块。我做错了什么?

【问题讨论】:

    标签: c++ qt qgraphicsitem qgraphicsscene


    【解决方案1】:

    在创建项目时,您已经将它们的不透明度设置为 0,因此它们不可见 - items() 仅返回可见项目,请参阅http://qt-project.org/doc/qt-4.8/qgraphicsscene.html#items-10:

    返回所有可见项...

    在构造函数中将不透明度设置为 > 0,例如

    newItem->setOpacity(0.001);
    

    现在按下空格键时,将出现给定矩形中的四个项目。

    【讨论】:

    • 谢谢安德烈亚斯。是我一个人还是这在任何地方都没有解释?我可以从您的链接中看到它提到了“所有可见项目”,但可见的定义似乎确实包括透明项目。
    • 我还没有进一步检查 - 也许这是 QGraphicsScene 中的优化,它假设完全透明的项目根据定义是不可见的......
    • 文档 (5.0) 将很快更新说明。
    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多