Перетаскивание QPixmaps внутри QGraphicsScene: как избежать 'auto', не разрешенного в параметре lambda - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь реализовать пользовательский QGraphicsScene, и когда мы нажимаем левую клавишу, он позволяет перетаскивать элемент, для которого я использую QDrag и передавать данные элемента, затем перезаписываю событие dropEvent, гдеЯ получаю элемент и dropEvent новый родитель.Я думаю, что QGraphicsPixmapItem поверх другого элемента может быть сложным, поэтому, возможно, лучшим вариантом будет установить его как parentItem.

Однако я получаю следующую ошибку 'auto' not allowed in lambda parameter и неточно знаю, почему

graphicsscene.h

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override;

graphicsscene.cpp

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    auto its =  items(QRectF(event->scenePos() - QPointF(1,1), QSize(3,3)));
    auto val = std::find_if(its.constBegin(), its.constEnd(), [](auto const& it){ // <-- ERROR HERE
        return it->type() > QGraphicsItem::UserType;
    });
    if(val == its.constEnd())
        return;
    if(event->button() == Qt::RightButton){
        showContextMenu(event->scenePos());
    }
    else{
        createDrag(event->scenePos(), event->widget(), *val);
    }
}

Спасибо за любую информацию оэто.

1 Ответ

1 голос
/ 18 марта 2019

Общие лямбды не поддерживаются в C ++ 11. Это означает, что у вас не может быть параметра с типом auto.

Просто обновить до C ++ 14:

QMAKE_CXXFLAGS += -std=c++14

Для этого потребуется не менее GCC 5.

Общие лямбды немного сложнее поддерживать, чем простые лямбды, потому что они требуют реализации шаблона как лямбда-замыкания.


Если вы хотите остаться с C ++ 11, вам нужно будет напрямую указать тип параметра вашей функции:

auto val = std::find_if(
    its.constBegin(),
    its.constEnd(),
    [](Item const& it) { // let Item be the 
                         // type of (*its.constBegin())
    }
);
...