Russian Qt Forum
Ноябрь 01, 2024, 06:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsItem::collidingItems().size() - не верно считает количество  (Прочитано 3525 раз)
marleeeeeey
Гость
« : Сентябрь 16, 2014, 10:45 »

greenCursor->QGraphicsItem::collidingItems().size() возвращает верное количество = 2,
если НЕ использовать redFrame->setFlag(QGraphicsItem::ItemClipsChildrenToShape)

greenCursor->QGraphicsItem::collidingItems().size() возвращает НЕ верное количество = 1,
если использовать redFrame->setFlag(QGraphicsItem::ItemClipsChildrenToShape)

необходимо, чтобы
greenCursor->QGraphicsItem::collidingItems().size() возвращал верное количество = 2
при использовании флага redFrame->setFlag(QGraphicsItem::ItemClipsChildrenToShape)



Код:
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QDebug>

class MyCursor : public QGraphicsRectItem
{
public:
    MyCursor(QGraphicsItem *_parent = 0) : QGraphicsRectItem(0, 0, 40, 15, _parent) { }

    ~MyCursor() { }

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
    {
        QList<QGraphicsItem *> colliding = collidingItems();

        QString str = QString("coll: ") + QString::number(colliding.size());

        painter->setPen(QPen(QColor(Qt::black), 2));
        painter->drawText(5, 12, str);

        painter->setPen(QPen(QColor(Qt::darkGreen), 2));
        painter->drawRect(rect());
       
    }



};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGraphicsScene *my_scene = new QGraphicsScene(QRectF(-100, -100, 400, 300));
    QGraphicsView *my_view = new QGraphicsView(my_scene);

    QGraphicsRectItem *redFrame = new QGraphicsRectItem(QRectF(0, 0, 250, 120));
    redFrame->setPen(QPen(QColor(Qt::red), 2));
    redFrame->setPos(10, 10);
    //redFrame->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
    my_scene->addItem(redFrame);

    QGraphicsRectItem *blueRect = new QGraphicsRectItem(QRectF(-40, -40, 80, 80), redFrame);
    blueRect->setPen(QPen(QColor(Qt::blue), 2));
    blueRect->setFlag(QGraphicsItem::ItemIsMovable);

    MyCursor *greenCursor = new MyCursor();
    greenCursor->setFlag(QGraphicsItem::ItemIsMovable);
    greenCursor->setPos(135, 160);
    my_scene->addItem(greenCursor);

    my_view->show();

    return a.exec();
}
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 16, 2014, 11:10 »

Непонятен вопрос. Вы имеете то, что имеете.

И по логике вещей, пусть и притянуто за уши, но верно.
Обрезая рисование потомков, по сути, родитель лишает их статуса "объекта". Потому коллизия происходит только с 1 объектом - родителем.

В чем проблема?
« Последнее редактирование: Сентябрь 16, 2014, 11:12 от Bepec » Записан
marleeeeeey
Гость
« Ответ #2 : Сентябрь 16, 2014, 12:28 »

Непонятно, почему флаг, который отвечает за отрисовку (т.е. QGraphicsItem::ItemClipsChildrenToShape), влияет на физическое положение объектов на сцене.
Требуется сделать так, чтобы объекты не отрисовывались за границами своего предка, но физически считались присутствующими на сцене.
В документации не описано такое поведение. Может есть идеи как сделать это по-другому?
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 16, 2014, 12:37 »

Ну смотрите - за объектами скрывается просто занимаемая ими область. Когда вы ставите флаг, у потомков область пространства тупо исчезает - её занимает родительская.
Записан
marleeeeeey
Гость
« Ответ #4 : Сентябрь 16, 2014, 13:01 »

boundingRect() и rect() потомков остаются без изменения. Следовательно, занимаемая им область также не должна изменяться. Исходя из документации флаг распространяется только на рисование объекта, но ни коим образом не влияет на его геометрию. Либо я что то не так понимаю.

цитата из документации
GraphicsItem::ItemClipsChildrenToShape   
Элемент обрезает рисование всех своих потомков внутри своего контура. Элементы которые явно или неявно являются потомками данного элемента не могут быть отрисованы вне его контура. По умолчанию этот флаг отключён; потомки могут отрисовываться везде. Это поведение навязывается QGraphicsView::drawItems() или QGraphicsScene::drawItems(). Этот флаг был введён в Qt 4.3.
Записан
Bepec
Гость
« Ответ #5 : Сентябрь 16, 2014, 13:23 »

Ну смотрим - если будут учитываться bound**, то мы получим в результате дохрена невидимых объектов. Ведь они не будут отрисовываться, но будут иметь bound**. Следовательно обрезается отрисовка и (по идее должно избирательно) отключается bound**.

ну а так надо исходники смотреть, но меня это сейчас не прельщает )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 20.