如何让 QGraphicsView 处理拖放?比如说,从某个文件夹中拖动一个图像文件,然后放到 QGraphicsView 中?视窗,QT5.2,C++。
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。
我还需要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"