QGraphicsSceneDragDropEvent отказывается срабатывать
Исследую 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
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!
- Akiv Doros
- Nov. 11, 2024, 10:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 8:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 8:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Добрый день.
Метод dragMoveEvent(QGraphicsSceneDragDropEvent) скорее должен отвечать за реальный drag and drop, когда генерируется это событие, а вот перетаскивание перемещаемых графических объектов внутри сцены не факт, что сработает. Попробуйте протестировать поведение вашей программы перетащив реальным drag and drop какой-нибудь файл из файлового менеджера в область графической сцены в окне вашего приложения.
Тогда, как минимум, должен будет появиться QMessageBox, как написано в вашем коде
Спасибо и с праздником, я уже разобрался. Все вообще по другому, а название DragDropEvent сбивает с толку. QGraphicsSceneDragDropEvent это когда мы тащим чего-то на сцену (не со сцены), например виджет.
Если что-то изминяется на самой сцене, это itemChange. Таким образом чтобы код работал надо переписать его вот так:
и реализация.