Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene
生活随笔
收集整理的這篇文章主要介紹了
Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
程序運行截圖如下:
程序很簡單,有個坑,如下:
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_Hmylistwidget.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_Hwidget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>class MyGraphicsScene;namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;MyGraphicsScene *m_scene; };#endif // WIDGET_Hmain.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; }總結
以上是生活随笔為你收集整理的Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-Qt仿大佬使用关键字(Q_
- 下一篇: C++|Qt最简单的http的get请求