ИВ
Иван ВолковMay 7, 2020, 11:16 a.m.

QGraphicsSceneDragDropEvent отказывается срабатывать

Qt5.12

Исследую QGraphicsSceneDragDropEvent, набросал вот такой код:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtCore>
#include <QtGui>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneDragDropEvent>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    QGraphicsScene *scene;
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

qmyscene.h

#ifndef QMYSCENE_H
#define QMYSCENE_H
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QDebug>
#include <QGraphicsPixmapItem>
#include <QCursor>
#include <QGraphicsSceneDragDropEvent>
#include <QPushButton>
class QMyScene: public QGraphicsScene
{
    Q_OBJECT
public:
    explicit QMyScene(QObject *parent = 0);
    ~QMyScene();
private:
    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
};
#endif // QMYSCENE_H

qpixitem.h

#ifndef QPIXITEM_H
#define QPIXITEM_H
#include <QGraphicsItem>
#include "QGraphicsScene"
#include "mainwindow.h"
#include <QGraphicsPixmapItem>
class QPixItem: public QGraphicsPixmapItem
{
public:
    QPixItem (QGraphicsScene *MyScene,int x,int y);
    QGraphicsScene *MyScene;
    int x,y;
};
#endif // QPIXITEM_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qmyscene.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QMyScene(this);
    ui->graphicsView->setScene(scene);
    //ui->graphicsView->setCursor(Qt::OpenHandCursor);
}
MainWindow::~MainWindow()
{
    delete ui;
}

qmyscene.cpp

#include "qmyscene.h"
#include "qpixitem.h"
#include <qdebug.h>
#include <QMessageBox>
QMyScene::QMyScene(QObject *parent) : QGraphicsScene(parent)
{
    QPixItem *pix1 = new QPixItem (this,100,100);
    QPixItem *pix2 = new QPixItem (this,50,50);
}
QMyScene::~QMyScene()
{
}
void QMyScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
    qDebug() << "Scene::есть движение";
    QMessageBox msgBox;
    msgBox.exec();
    //QGraphicsScene::dragMoveEvent(event);
}

qpixitem.cpp

#include "qpixitem.h"
QPixItem::QPixItem (QGraphicsScene *MyScene,int x,int y): QGraphicsPixmapItem()
{
    QPixmap  pic (":/Items/OutLet.png");
    this->setPixmap(pic);
    this->setPos(x, y);
    this->setZValue(10);
    this->setAcceptDrops(true);
    this->setFlags(QGraphicsItem::ItemIsMovable);
    MyScene->addItem(this);
}

Идея проста, реализуется класс QMyScene наследуемый от QGraphicsScene в котором перегружается событие dragMoveEvent(QGraphicsSceneDragDropEvent)
QGraphicsPixmapItem добавлены на сцену, у них есть флаг ItemIsMovable чтобы таскать их мышкой и setAcceptDrops(true) чтобы была какая-то реакция на перетаскивание (различные темы на форуме утверждают что это важно).
Как утверждает справка dragMoveEvent(QGraphicsSceneDragDropEvent) срабатывает когда над сценой чего-то перетаскивают. Но вот я перетаскиваю а - void QMyScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event) по какой-то причине не отрабатывает.
В чем может быть дело ?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

2
Evgenii Legotckoi
  • May 8, 2020, 10:33 a.m.

Добрый день.
Метод dragMoveEvent(QGraphicsSceneDragDropEvent) скорее должен отвечать за реальный drag and drop, когда генерируется это событие, а вот перетаскивание перемещаемых графических объектов внутри сцены не факт, что сработает. Попробуйте протестировать поведение вашей программы перетащив реальным drag and drop какой-нибудь файл из файлового менеджера в область графической сцены в окне вашего приложения.

Тогда, как минимум, должен будет появиться QMessageBox, как написано в вашем коде

    ИВ
    • May 9, 2020, 10:52 a.m.

    Спасибо и с праздником, я уже разобрался. Все вообще по другому, а название DragDropEvent сбивает с толку. QGraphicsSceneDragDropEvent это когда мы тащим чего-то на сцену (не со сцены), например виджет.
    Если что-то изминяется на самой сцене, это itemChange. Таким образом чтобы код работал надо переписать его вот так:

    #ifndef QPIXITEM_H
    #define QPIXITEM_H
    #include <QGraphicsItem>
    #include "QGraphicsScene"
    #include "mainwindow.h"
    #include <QGraphicsPixmapItem>
    
    class QPixItem: public QGraphicsPixmapItem
    {
    public:
    
        QPixItem (QGraphicsScene *MyScene,int x,int y);
        QGraphicsScene *MyScene;
        int x,y;
    
    private:
        QGraphicsLineItem* line;
        QVariant itemChange(GraphicsItemChange change, const QVariant &value);
    };
    #endif // QPIXITEM_H
    

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

    #include "qpixitem.h"
    #include <QMessageBox>
    
    QPixItem::QPixItem (QGraphicsScene *MyScene,int x,int y): QGraphicsPixmapItem()
    {
        QPixmap  pic (":/Items/OutLet.png");
        this->setPixmap(pic);
        this->setPos(x, y);
        this->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
        this->line = MyScene->addLine(QLineF(40, 40, 80, 80));
        MyScene->addItem(this);
    }
    QVariant QPixItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
    {
        if (change == ItemPositionChange)
          {
            QPointF newPos = value.toPointF();
            int p1 = newPos.x();
            int p2 = newPos.y();
            this->line->setLine(QLineF(40,40,p1, p2));
          }
          return QGraphicsItem::itemChange(change, value);
    }
    
    

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      AD

      C ++ - Test 004. Pointers, Arrays and Loops

      • Result:50points,
      • Rating points-4
      m

      C ++ - Test 004. Pointers, Arrays and Loops

      • Result:80points,
      • Rating points4
      m

      C ++ - Test 004. Pointers, Arrays and Loops

      • Result:20points,
      • Rating points-10
      Last comments
      i
      innorwallNov. 14, 2024, 8:07 p.m.
      Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
      i
      innorwallNov. 14, 2024, 7:42 p.m.
      How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
      i
      innorwallNov. 14, 2024, 5:09 p.m.
      Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
      i
      innorwallNov. 14, 2024, 12:05 p.m.
      EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
      i
      innorwallNov. 14, 2024, noon
      PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots) priligy 30mg Am J Obstet Gynecol 171 1488 505
      Now discuss on the forum
      i
      innorwallNov. 14, 2024, 11:39 a.m.
      добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
      i
      innorwallNov. 11, 2024, 6:55 p.m.
      Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
      9
      9AnonimOct. 25, 2024, 4:10 p.m.
      Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

      Follow us in social networks