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) по какой-то причине не отрабатывает.
В чем может быть дело ?
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Добрый день.
Метод dragMoveEvent(QGraphicsSceneDragDropEvent) скорее должен отвечать за реальный drag and drop, когда генерируется это событие, а вот перетаскивание перемещаемых графических объектов внутри сцены не факт, что сработает. Попробуйте протестировать поведение вашей программы перетащив реальным drag and drop какой-нибудь файл из файлового менеджера в область графической сцены в окне вашего приложения.
Тогда, как минимум, должен будет появиться QMessageBox, как написано в вашем коде
Спасибо и с праздником, я уже разобрался. Все вообще по другому, а название DragDropEvent сбивает с толку. QGraphicsSceneDragDropEvent это когда мы тащим чего-то на сцену (не со сцены), например виджет.
Если что-то изминяется на самой сцене, это itemChange. Таким образом чтобы код работал надо переписать его вот так:
и реализация.