2010-08-19 1 views
0

프로젝트 용 빌더를 개발 중입니다. 내 응용 프로그램에서 끌어서 놓기 지원과 상황에 맞는 메뉴를 모두 사용하고 싶습니다. 현재 드래그 앤 드롭 지원을 사용하고 있지만 상황에 맞는 메뉴는 사용할 수 없습니다. 왼쪽 측면 gui는 도구 상자입니다. 위젯을 오른쪽으로 드래그 앤 드롭 (QGraphicsScene)하고 있으며 QGraphicsScene 내부에서 컨텍스트 메뉴를 사용하려고합니다. 나는 전에 그래픽 장면 안에서 컨텍스트 메뉴를 사용한다. 하지만 전에 드랍프 사용하지 않았다 & 드롭 작업. 적절한 코드를 작성했지만 작동하지 않습니다. 누락 된 부분은 무엇입니까? (관련 드래그 & 드롭입니까). 아래는 내 코드 파일입니다.
//#dragwidget.cpp - 도구 상자 위젯끌어서 놓기 작업 후 이벤트가 작동하지 않습니다.

#include "dragwidget.h" 

DragWidget::DragWidget(void) 
{ 
} 

DragWidget::~DragWidget(void) 
{ 
} 

void DragWidget::mousePressEvent(QMouseEvent *ev) 
{ 
    if(ev->button() == Qt::LeftButton) 
    { 
     QMimeData *data = new QMimeData; 
     data->setProperty("type",property("type")); 
     QDrag *drag = new QDrag(this); 
     drag->setMimeData(data); 
     drag->start(); 
    } 
} 

//#view.cpp -를 QGraphicsView

#include "view.h" 

View::View(Scene *scene,QWidget *parent) 
:QGraphicsView(scene,parent) 
{ 
} 

View::~View() 
{ 
} 

//#scene.cpp에 대한 래퍼 클래스 - QGraphicsScene하는 캐치 드롭에 대한 래퍼 클래스 이벤트

#include "scene.h" 

Scene::Scene(QObject *parent) 
:QGraphicsScene(parent) 
{ 
} 

Scene::~Scene(void) 
{ 
} 

void Scene::setSceneRect(qreal x, qreal y, qreal w, qreal h) 
{ 
    QGraphicsScene::setSceneRect(x,y,w,h); 
} 

void Scene::dragEnterEvent(QGraphicsSceneDragDropEvent *e) 
{ 
    if(e->mimeData()->hasFormat("text/plain")); 
     e->acceptProposedAction(); 
} 

void Scene::dragMoveEvent(QGraphicsSceneDragDropEvent *e) 
{ 
} 

void Scene::dropEvent(QGraphicsSceneDragDropEvent *e) 
{ 
    e->acceptProposedAction(); 
    int itemType = e->mimeData()->property("type").toInt(); 
    switch(itemType) 
    { 
    case BlockSegment: 
     drawStandartBlockSegment(e->scenePos()); 
     break; 
    case Switch: 
     drawStandartSwitch(e->scenePos()); 
     break; 
    case Signal: 
     drawStandartSignal(e->scenePos()); 
     break; 
    } 
} 

void Scene::drawStandartBlockSegment(QPointF p) 
{ 
    BlockSegmentItem *blockSegment = new BlockSegmentItem(p.x(),p.y(),p.x()+100,p.y()); 
    addItem(blockSegment); 
} 

void Scene::drawStandartSwitch(QPointF p) 
{ 
    SwitchItem *switchItem = new SwitchItem(":app/SS.svg"); 
    switchItem->setPos(p); 
    addItem(switchItem); 
} 

void Scene::drawStandartSignal(QPointF p) 
{ 
    SignalItem *signalItem = new SignalItem(":app/sgs3lr.svg"); 
    signalItem->setPos(p); 
    addItem(signalItem); 
} 

//#item.cpp - 내 사용자 정의 그래픽 장면 항목에 대한 기본 클래스

#include "item.h" 

Item::Item(ItemType itemType, QGraphicsItem *parent) 
:QGraphicsWidget(parent),m_type(itemType) 
{ 
} 

Item::~Item() 
{ 
} 

int Item::type() 
{ 
    return m_type; 
} 

QRectF Item::boundingRect() const 
{ 
    return QRectF(0,0,0,0); 
} 

QPainterPath Item::shape() const 
{ 
    QPainterPath path; 
    return path; 
} 

void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    Q_UNUSED(painter); 
    Q_UNUSED(option); 
    Q_UNUSED(widget); 
} 

void Item::deleteItem() 
{ 

} 

void Item::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) 
{ 
    Q_UNUSED(event); 
} 

//#switchitem.cpp - 내 사용자 지정 스위치 항목.

#include "switchitem.h" 

SwitchItem::SwitchItem(const QString& fileName,QGraphicsItem *parent /* = 0 */) 
:Item(Switch,parent) 
{ 
    svg = new QGraphicsSvgItem(fileName,this); 
    createActions(); 
    createContextMenu(); 
} 

SwitchItem::~SwitchItem(void) 
{ 
} 

QRectF SwitchItem::boundingRect() const 
{ 
    return QRectF(pos().x(),pos().y(),svg->boundingRect().width(), 
            svg->boundingRect().height()); 
} 

QPainterPath SwitchItem::shape() const 
{ 
    QPainterPath path; 
    path.addRect(boundingRect()); 
    return path; 
} 

void SwitchItem::createActions() 
{ 
    deleteAct = new QAction("Sil",this); 
    deleteAct->setIcon(QIcon(":app/delete.png")); 
    connect(deleteAct,SIGNAL(triggered()),this,SLOT(deleteItem())); 
} 

void SwitchItem::createContextMenu() 
{ 
    contextMenu = new QMenu("SwitchContextMenu"); 
    contextMenu->addAction(deleteAct); 
} 

void SwitchItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *e) 
{ 
    contextMenu->exec(e->screenPos()); 
} 

//#app.cpp - Application 클래스는

#include "app.h" 
#include "dragwidget.h" 

App::App(QWidget *parent, Qt::WFlags flags) 
    : QMainWindow(parent, flags) 
{ 
    Q_INIT_RESOURCE(app); 
    ui.setupUi(this); 
    canvasScene = new Scene(this); 
    canvasScene->setSceneRect(0,0,5000,5000); 
    canvasView = new View(canvasScene); 
    canvasView->setBackgroundBrush(Qt::black); 
    canvasView->ensureVisible(0,0,canvasView->geometry().width(),canvasView->geometry().height()); 
    QHBoxLayout *layout = new QHBoxLayout; 
    toolBox = new QFrame(this); 
    layout->addWidget(toolBox,1); 
    layout->addWidget(canvasView,7); 
    ui.centralWidget->setLayout(layout); 
    createToolBox(); 

} 

App::~App() 
{ 

} 

void App::createToolBox() 
{ 
    QVBoxLayout *layout = new QVBoxLayout; 
    QLabel *blockSegmentLabel = new QLabel("Block Segment"); 
    DragWidget *blockSegmentWidget = new DragWidget; 
    blockSegmentWidget->setProperty("type",BlockSegment); 
    blockSegmentWidget->setPixmap(QPixmap(":app/blocksegment.png")); 
    QLabel *switchLabel = new QLabel("Switch"); 
    DragWidget *switchWidget = new DragWidget; 
    switchWidget->setProperty("type",Switch); 
    switchWidget->setPixmap(QPixmap(":app/SS.png")); 
    QLabel *signalLabel = new QLabel("Signal"); 
    DragWidget *signalWidget = new DragWidget; 
    signalWidget->setProperty("type",Signal); 
    signalWidget->setPixmap(QPixmap(":app/sgs3lr.png")); 
    layout->addWidget(blockSegmentLabel); 
    layout->addWidget(blockSegmentWidget); 
    layout->addWidget(switchLabel); 
    layout->addWidget(switchWidget); 
    layout->addWidget(signalLabel); 
    layout->addWidget(signalWidget); 
    toolBox->setLayout(layout); 
} 

답변

1
void DragWidget::mousePressEvent(QMouseEvent *ev) 
{ 
    if(ev->button() == Qt::LeftButton) 
    { 
     QMimeData *data = new QMimeData; 
     data->setProperty("type",property("type")); 
     QDrag *drag = new QDrag(this); 
     drag->setMimeData(data); 
     drag->start(); 
    } 
} 

문제는 여기에있다. 마우스 오른쪽 버튼을 "먹어"했습니다. mousePressEvent의 기본 구현으로 넘어갑니다.

+0

마우스 버튼과 관련된 문제는 아닌 것 같습니다. 왜냐하면 기본 임 플레 멘션으로 돌아가지만 컨텍스트 메뉴가 작동하지 않기 때문입니다. – onurozcelik

+0

비슷한 문제가 발생했다고 생각합니다. 드래그 앤 드롭을 수행 한 후, 다음 번 마우스 누름은 이전에 드래그 된 GraphicsWidget에 의해 수신됩니다. 이걸 알아 냈어? – Brianide