Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QGraphicsItem::collidingItems() - проблема при использовании флага QGraphicsItem::ItemClipsChildrenToShape



  • Если использую этот флаг (для отображения только внутри QGraphicsItem)
    @
    redFrame->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
    @

    то количество пересечений greenCursor с другими QGraphicsItem отличное от варианта без использования этого флага - это проблема...

    Приложил ссылку на скриншоты и исходный код.

    "ScreenShot":https://www.dropbox.com/sh/qsy9rrs173b9phi/AACxpebv4NsoqM3wUnScqvxoa?dl=0

    @
    #include <QtWidgets/QApplication>
    #include <QGraphicsView>
    #include <QGraphicsScene>
    #include <QGraphicsItem>
    #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&#40;&#41;;
    

    }

    @



  • при использовании флага QGraphicsItem::ItemClipsChildrenToShape для текущего QGraphicsItem, все его потомки отображаются, но при поиске пересечений потомки не учитываются, как отдельные QGraphicsItem.
    Может быть есть какой-то другой "человеческий" способ ограничить отображение объектов рамкой, не используя этот флаг?


Log in to reply