程序运行截图如下:
程序很简单,有个坑,如下:
QGraphicsScene要经过
dragMoveEvent(QGraphicsSceneDragDropEvent *event)
才能触发这个
dropEvent(QGraphicsSceneDragDropEvent *event)
程序结构如下:
源代码如下:
mygraphicsscene.h
#ifndef MYGRAPHICSSCENE_H
#define MYGRAPHICSSCENE_H
#include <QObject>
#include <QGraphicsView>
class MyGraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
MyGraphicsScene(QWidget *parent=0);
~MyGraphicsScene();
void createRect(const QPointF &pt);
void createLine(const QPointF &pt);
protected:
void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
void dropEvent(QGraphicsSceneDragDropEvent* event);
void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
private:
QGraphicsScene *m_scene;
};
#endif // MYGRAPHICSSCENE_H
mylistwidget.h
#ifndef MYLISTWIDGET_H
#define MYLISTWIDGET_H
#include <QObject>
#include <QListWidget>
class MyListWidget:public QListWidget
{
Q_OBJECT
public:
MyListWidget(QWidget *parent=0);
~MyListWidget();
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
private:
QPoint m_dragPosition; // 拖放起点
QListWidgetItem *m_dragItem; // 被拖放的item
};
#endif // MYLISTWIDGET_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class MyGraphicsScene;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
MyGraphicsScene *m_scene;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
mygraphicsscene.cpp
#include "mygraphicsscene.h"
#include <QDebug>
#include <QMimeData>
#include <QGraphicsSceneDragDropEvent>
#include <QGraphicsLineItem>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QPen>
MyGraphicsScene::MyGraphicsScene(QWidget *parent):
QGraphicsScene(parent)
{
}
MyGraphicsScene::~MyGraphicsScene()
{
}
void MyGraphicsScene::createRect(const QPointF &pt)
{
QGraphicsRectItem *item=new QGraphicsRectItem;
item->setRect(pt.x(),pt.y(),18,50);
item->setBrush(QBrush(Qt::red));
item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
this->addItem(item);
}
void MyGraphicsScene::createLine(const QPointF &pt)
{
QGraphicsLineItem *item=new QGraphicsLineItem;
item->setLine(pt.x(),pt.y(),pt.x(),pt.y()+56);
item->setPen(QPen(Qt::red,5));
item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
this->addItem(item);
}
void MyGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
if(event->mimeData()->hasFormat("text/plain")){
event->acceptProposedAction();
}
}
void MyGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{
if (event->mimeData()->hasFormat("text/plain"))
{
QString text=event->mimeData()->text();
if(text=="矩形"){
createRect(event->scenePos());
}
else if(text=="直线"){
createLine(event->scenePos());
}
else{
}
event->acceptProposedAction();
}
}
void MyGraphicsScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
event->accept();
}
mylistwidget.cpp
#include "mylistwidget.h"
#include <QMouseEvent>
#include <QListWidgetItem>
#include <QDrag>
#include <QApplication>
#include <QMimeData>
#include <QPainter>
#include <QPixmap>
MyListWidget::MyListWidget(QWidget *parent):
QListWidget(parent)
{
}
MyListWidget::~MyListWidget(){
}
void MyListWidget::mouseMoveEvent(QMouseEvent *event){
if(!(event->buttons()&Qt::LeftButton))
return;
if((event->pos()-m_dragPosition).manhattanLength()<QApplication::startDragDistance())
return;
if(!m_dragItem)
return;
QDrag *drag=new QDrag(this);
QMimeData *mimeData=new QMimeData;
mimeData->setText(currentItem()->text());
drag->setMimeData(mimeData);
if(mimeData->text()=="矩形"){
QPixmap dragImg(18,50);
QPainter painter(&dragImg);
painter.setBrush(QBrush(Qt::red));
painter.drawRect(0,0,18,50);
drag->setPixmap(dragImg);
}
else if(mimeData->text()=="直线"){
QPixmap dragImg(2,56);
QPainter painter(&dragImg);
painter.setPen(QPen(Qt::red,2));
painter.drawLine(0,0,0,56);
drag->setPixmap(dragImg);
}
else{
}
drag->exec(Qt::CopyAction|Qt::MoveAction);
}
void MyListWidget::mousePressEvent(QMouseEvent *event){
m_dragPosition=event->pos();
m_dragItem=this->itemAt(event->pos());
//保持父类继承下来的按键行为
QListWidget::mousePressEvent(event);
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mygraphicsscene.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("CSDN IT1995");
QStringList strList;
strList.append("矩形");
strList.append("直线");
ui->listWidget->insertItems(0,strList);
ui->listWidget->setDragEnabled(true);
m_scene=new MyGraphicsScene;
m_scene->setSceneRect(0,0,ui->graphicsView->width(),ui->graphicsView->height());
ui->graphicsView->setScene(m_scene);
}
Widget::~Widget()
{
delete ui;
}