как получить события перетаскивания объекта, который находится в графической сцене? - PullRequest
0 голосов
/ 27 июня 2018

У меня установлен графический вид (вид QGraphics) (сцена QGraphic). Я удаляю объекты на сцене, все работает нормально, я должен назначить параметр для отброшенного объекта путем перетаскивания параметра из списка параметров. Я реализовал события перетаскивания объекта Но когда я перетаскиваю параметр из списка неприемлемых символов на объекте. Как назначить параметр объекту, удалив его? Любые другие предложения и примеры приветствуются, где я могу получить идеи для реализации.

изображение gui

speedometer.cpp

#include <QMimeData>   

SpeedoMeter::SpeedoMeter( QWidget *parent ):
    QwtDial( parent ),
    d_label( "km/h" )   
{

    setAcceptDrops(true);

}

void SpeedoMeter::dragEnterEvent(QDragEnterEvent *event)   
{    

    if (event->mimeData()->hasFormat(paramlistMimeType()))
    {
    qDebug()<<"dragenter event in speedo" ;
    event->accept();
    }

}

void SpeedoMeter::dragMoveEvent(QDragMoveEvent *event)
{

    if (event->mimeData()->hasFormat(paramlistMimeType()))
    {
    qDebug()<<"dragmove event in speedo" ; 
    event->acceptProposedAction();
    }

}

void SpeedoMeter::dropEvent(QDropEvent *event)
{

    if (event->mimeData()->hasFormat(paramlistMimeType()))
    {
     qDebug()<<"dragmove event in speedo" ;   
      event->accept();   
    }

}

1 Ответ

0 голосов
/ 27 июня 2018

В следующем примере показано, как реализовать логику для приема перетаскивания:

speedometer.h

#ifndef SPEEDOMETER_H
#define SPEEDOMETER_H

#include <qwt_dial.h>

class SpeedoMeter : public QwtDial
{
public:
    SpeedoMeter(QWidget *parent=nullptr);

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void paintEvent(QPaintEvent *event);
private:
    QString d_label;
};


#endif // SPEEDOMETER_H

speedometer.cpp

#include "speedometer.h"

#include <qwt_dial_needle.h>

#include <QDragEnterEvent>
#include <QMimeData>
#include <QPainter>

SpeedoMeter::SpeedoMeter(QWidget *parent):
    QwtDial(parent),
    d_label( "km/h" )
{
    setAcceptDrops(true);
    QwtDialSimpleNeedle *nd = new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow, Qt::white, Qt::red);
    setNeedle(nd);
    setValue(80);
}

void SpeedoMeter::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
        event->acceptProposedAction();
}

void SpeedoMeter::dropEvent(QDropEvent *event)
{
    const QMimeData *mimedata = event->mimeData();

    if(mimedata->hasFormat("application/x-qabstractitemmodeldatalist")){
        QString text;
        // /1051228/kak-dekodirovat-application-x-qabstractitemmodeldatalist-v-qt-dlya-peretaskivaniya
        QByteArray encoded = mimedata->data("application/x-qabstractitemmodeldatalist");
        QDataStream stream(&encoded, QIODevice::ReadOnly);
        while (!stream.atEnd()) {
            int row, col;
            QMap<int,  QVariant> roleDataMap;
            stream >> row >> col >> roleDataMap;
            if(roleDataMap.contains(Qt::DisplayRole)){
                text = roleDataMap[Qt::DisplayRole].toString();
                break;
            }
        }
        // your text
        d_label = text;
        update();
    }
}

void SpeedoMeter::dragMoveEvent(QDragMoveEvent *event)
{
    if(event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist"))
        event->accept();
}

void SpeedoMeter::paintEvent(QPaintEvent *event)
{
    // https://stackoverflow.com/questions/43904204/qwt-dial-show-unit
    QwtDial::paintEvent(event);
    QPainter painter(this);
    painter.setPen(Qt::black);
    QFont font;
    font.setPointSize(11);
    painter.setFont(font);
    QString text = QString("%1 %2").arg(value()).arg(d_label);
    QPoint c = rect().center();
    QSize Size = painter.fontMetrics().size(Qt::TextSingleLine, text);
    painter.drawText(QPointF(c.x() -Size.width()/2, c.y() + 2.5*Size.height()), text);

}

main.cpp

#include "speedometer.h"

#include <QApplication>
#include <QGraphicsView>
#include <QHBoxLayout>
#include <QListWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QHBoxLayout *layout = new QHBoxLayout(&w);
    QListWidget listWidget;
    listWidget.setDragDropMode(QAbstractItemView::DragOnly);
    listWidget.addItems({"km/h", "ft/s", "m/s", "miles/h"});

    QGraphicsView view;
    QGraphicsScene scene;
    view.setScene(&scene);

    SpeedoMeter speed;
    scene.addWidget(&speed);
    layout->addWidget(&listWidget);
    layout->addWidget(&view);
    w.show();

    return a.exec();
}

enter image description here enter image description here

В следующей ссылке вы можете найти полный пример.

...