2017-01-29 34 views
0

Моя простая база кода на стандартном примере Qt 'diagram scene'. MainWindow - это просто просто загружать пользовательскую сцену. Пользовательский интерфейс выполнен в графическом редакторе. Перетащите и переместите графический многоугольник с помощью правой кнопки мыши, влево создайте новый элемент. Так? Я должен дважды щелкнуть по элементу, чтобы выбрать его. И элемент нужен двойной щелчок без последнего клика, когда я хочу переместить элемент. Полное головокружение.Qt - drag move qgraphicitem dont work nice

Код товара:

BasicDiagramItem::BasicDiagramItem(QGraphicsItem *parent): 
    QGraphicsPolygonItem(parent) 
{ 
    drawCustomPoly(); 
} 

void BasicDiagramItem::drawCustomPoly() 
{ 
    QPainterPath path; 
    customPoly << QPointF(0,50) << QPointF(50,0) 
       << QPointF(0,-50) << QPointF(-50,0) 
       << QPointF(0,50); 
    setPolygon(customPoly); 
    setFlag(QGraphicsItem::ItemIsMovable, true); 
    setFlag(QGraphicsItem::ItemIsSelectable, true); 
    setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); 
    //setFlag(QGraphicsItem::ItemClipsToShape,true); //testowe 

} 

void BasicDiagramItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{ 

    QGraphicsPolygonItem::mouseMoveEvent(event); 
} 

код Сцена:

DiagramScene::DiagramScene(QObject *parent): 
    QGraphicsScene(parent) 
{ 

} 

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    if(mouseEvent->button() != Qt::RightButton) return; 

    BasicDiagramItem *item; 
    item = new BasicDiagramItem(); 
    //item->setBrush() 
    addItem(item); 
    item->setPos(mouseEvent->scenePos()); 
    QGraphicsScene::mousePressEvent(mouseEvent); 

} 

void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    QGraphicsScene::mouseMoveEvent(mouseEvent); 

} 

void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    QGraphicsScene::mouseReleaseEvent(mouseEvent); 
} 

Этот код сходство с примером Qt. Я просто не использую режим для создания другого объекта, не использую меню cutom, и я не рисую стрелки.

Итак, что я делаю неправильно? Почему приложения имеют ошибку с двойным щелчком?

+0

есть ли вопрос, который вы хотели спросить здесь ? –

+0

Thx, я забыл написать непосредственно вопросы. На мой взгляд, у меня есть неправильные запуски соединений = вопросы об этом. dit post :) –

ответ

0

Итак, что я делаю неправильно? Почему приложения имеют ошибку с двойным щелчком?

Я думаю, что это причина:

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    if(mouseEvent->button() != Qt::RightButton) return; 

Обратите внимание, что на одной левой кнопкой мыши, mousePressEvent() просто возвращает, ничего не делая; что объясняет, почему ничего не происходит, когда вы используете один-левый клик. (На двойном щелчке, OTOH, mouseDoubleClickEvent() вызывается вместо этого, и поскольку вы не переопределили mouseDoubleClickEvent(), вызывается метод QGraphicsScene :: mouseDoubleClickEvent() и обрабатывает щелчок.

Я думаю, что вы хочешь сделать вместо этого заключается в следующем:.

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    if(mouseEvent->button() != Qt::RightButton) 
    { 
     QGraphicsScene::mousePressEvent(mouseEvent); // call up to superclass 
     return; 
    } 

    [...] 

Таким образом, QGraphicsScene :: mousePressEvent (MouseEvent) может выполнять работу, выбрав пункт о том, что пользователь нажал на

+0

Спасибо, человек! Im настолько глупо: D Это отлично работает. Для будущих поколений пример может ввести в заблуждение, потому что пример использует «голый» возврат при неправильной кнопке (но перемещение элементов) и следующий случай переключения для создания другого объекта. Немного головокружение. Опять же, спасибо :) –