Невозможно реализовать перетаскивание для TextItem

Это моя первая попытка использовать функцию перетаскивания в Qt. Я новичок, я сделал свой первый подкласс на этой неделе, хотя я делал другие программы на 2 Qt в прошлом.

Мне нужен перемещаемый элемент Drag&Drop QGraphicsTextItem для отображения на QGraphicsView, который подключен к соответствующему QGraphicScene. Так что я могу получить новую позицию элемента.

Я посмотрел пример анимированного робота и эту ссылку: http://www.qtcentre.org/threads/50028-Drag-and-Drop-QGraphicsTextItem

Код по ссылке выше выглядел хорошо для моего. Поэтому я переопределил это, но при сборке компилятор показывает все виды ошибок, которые я не знаю, как их преодолеть. Я не знаю, с чего начать, и не знаю, какой фрагмент кода неправильный...

примеры появления ошибок:

error: no matching function for call to 'GraphicsTextItem::setCursor(Qt::CursorShape)'
     setCursor(Qt::OpenHandCursor);
                                 ^

error: invalid use of incomplete type 'class QGraphicsSceneDragDropEvent'
     if(event->mimeData()->hasText())
             ^

error: forward declaration of 'class QGraphicsSceneDragDropEvent'
 class QGraphicsSceneDragDropEvent;
   ^

Я оставлю код:

Заголовок:

#ifndef GRAPHICSTEXTITEM_H
#define GRAPHICSTEXTITEM_H

#include <QGraphicsTextItem>

class GraphicsTextItem : public QGraphicsTextItem
{
    Q_OBJECT

public:
    GraphicsTextItem(QGraphicsItem *parent = 0);

protected:
    void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
    void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
    void dropEvent(QGraphicsSceneDragDropEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

private:
    bool dragOver;
};
//! [0]





#endif // GRAPHICSTEXTITEM_H

и реализация:

#include <graphicstextitem.h>
#include <QDrag>
//#include <QGraphicsScene>


GraphicsTextItem::GraphicsTextItem(QGraphicsItem *parent)
    :QGraphicsTextItem(parent)
{
    //setFlag(QGraphicsItem::ItemIsSelectable);
    setFlag(QGraphicsItem::ItemIsMovable);
    setTextInteractionFlags(Qt::TextEditorInteraction);
    setAcceptedMouseButtons(Qt::LeftButton);
    setAcceptDrops(true);

    setCursor(Qt::OpenHandCursor);
}



void GraphicsTextItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
    if(event->mimeData()->hasText())
    {
        event->setAccepted(true);
        update();
        dragOver = true;
    }
    else
        event->setAccepted(false);
}


void GraphicsTextItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
    Q_UNUSED(event);
    dragOver = false;
    update();
}


void GraphicsTextItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    event->setAccepted(true);
    //qDebug() << "I dropped it";
    dragOver = false;
    update();
}


void GraphicsTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    Q_UNUSED(event);
    setCursor(Qt::ClosedHandCursor);
}


void GraphicsTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if (QLineF(event->screenPos(), event->buttonDownScreenPos(Qt::LeftButton)).length()
            < QApplication::startDragDistance())
        return;

    QDrag *drag = new QDrag(event->widget());
    QMimeData *mime = new QMimeData;
    mime->setText(this->toPlainText());
    drag->setMimeData(mime);
    drag->exec();

    setCursor(Qt::OpenHandCursor);
}


void GraphicsTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    Q_UNUSED(event);
    setCursor(Qt::OpenHandCursor);
}

1 ответ

Решение

Сообщение об ошибке говорит о том, что где-то в вашем коде есть предварительное объявление, хотя это не так в зависимости от кода, который вы уже показали.

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

 #include <QGraphicsSceneDragDropEvent>
Другие вопросы по тегам