1

如何让 QGraphicsView 处理拖放?比如说,从某个文件夹中拖动一个图像文件,然后放到 QGraphicsView 中?视窗,QT5.2,C++。

4

2 回答 2

2

你需要创建一个 QGraphicsScene 的子类(如果你还没有这样做的话)并覆盖它的 dragEnterEvent(QGraphicsSceneDragDropEvent *) 方法来调用它的参数的 acceptProposedAction() 如果参数代表一个你可以处理的图像文件-- 即如果dragDropEvent->mimeData()->hasUrls() 返回true,并且dragDropEvent->mimeData()->urls() 返回的QUrls中至少有一个可以用来构造一个有效的QPixmap(通过QPixmap( url[i]->toLocalFile))。

然后你需要重写 dropEvent(QGraphicsSceneDragDropEvent *) 方法来创建一个新的 QGraphicsPixmapItem 对象(使用 QGraphicsSceneDragDropEvent 对象的 mimeData 对象中指定的文件名创建的 QPixmap)并将 QGraphicsPixmapItem 添加到 QGraphicsScene。

于 2013-07-08T15:39:54.890 回答
1

我还需要QGraphicsItem在场景和setAcceptDrops(true)项目上添加一个。该background项目在以下代码中执行此工作。

#include <QApplication>
#include <QDragEnterEvent>
#include <QGraphicsRectItem>
#include <QGraphicsSceneDragDropEvent>
#include <QGraphicsView>
#include <QMainWindow>
#include <QMimeData>
#include <QUrl>

class MyGraphicsScene : public QGraphicsScene
{
    Q_OBJECT

  protected:
    QGraphicsRectItem* background = nullptr;

  public:
    MyGraphicsScene()
    {
        this->addItem( this->background = new QGraphicsRectItem(0, 0, 1, 1) );
        background->setAcceptDrops(true);
    }

    virtual void resize(int width, int height)
    {
        this->background->setRect(0, 0, width - 1, height - 1);
    }

  protected:
    virtual void dragEnterEvent(QGraphicsSceneDragDropEvent* event) override
    {
        if ( event->mimeData()->hasUrls() )
            event->acceptProposedAction();
    }

    virtual void dropEvent(QGraphicsSceneDragDropEvent* event) override
    {
        if ( event->mimeData()->hasUrls() )
            foreach ( const QUrl& url, event->mimeData()->urls() )
                qDebug("GraphicsScene: dropped %s", qPrintable(url.toLocalFile()) );
    }
};

class MyGraphicsView : public QGraphicsView
{
    Q_OBJECT

  protected:
    MyGraphicsScene myGraphicsScene;

  public:
    MyGraphicsView()
    {
        this->setScene( &this->myGraphicsScene );
    }

  protected:
    virtual void resizeEvent(QResizeEvent* event) override
    {
        this->myGraphicsScene.resize( event->size().width(), event->size().height() );
    }
};

class MyMainWindow : public QMainWindow
{
    Q_OBJECT

  protected:
    MyGraphicsView* myGraphicsView = nullptr;

  public:
    MyMainWindow(QWidget *parent = nullptr)
        : QMainWindow(parent)
    {
        this->setAcceptDrops(true);
        this->setCentralWidget(this->myGraphicsView = new MyGraphicsView());
    }

  protected:
    virtual void dragEnterEvent(QDragEnterEvent* event) override
    {
        if ( event->mimeData()->hasUrls() )
            event->acceptProposedAction();
    }

    virtual void dropEvent(QDropEvent *event) override
    {
        if ( event->mimeData()->hasUrls() )
            foreach ( const QUrl& url, event->mimeData()->urls() )
                qDebug("MainWindow: dropped %s", qPrintable(url.toLocalFile()) );
    }
};

int main(int argc, char *argv[])
{
    QApplication application(argc, argv);
    MyMainWindow myMainWindow;
    myMainWindow.show();
    return application.exec();
}

#include "main.moc"
于 2019-11-23T21:18:40.733 回答