2017-01-29 3 views
0

Mon base de code simple sur exemple Qt 'diagramme scène'. MainWindow est le plus simplement, seulement charger la scène personnalisée. L'interface utilisateur est faite dans l'éditeur graphique. Faites glisser et déplacez graphique polygone travail avec le bouton droit de la souris, à gauche créer un nouvel élément. Alors? Je dois double-cliquer sur l'élément pour le sélectionner. Et l'article doit double-cliquer avec aucune libération dernier clic quand je veux déplacer l'article. Est complètement étourdi.Qt - glisser déplacer qgraphicitem ne fonctionne pas bien

Code article:

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); 
} 

Code scène:

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); 
} 

Ce code est par exemple ressemblance avec Qt. Je n'utilise juste que le mode pour créer un objet différent, ne pas utiliser le menu cutom et je ne dessine pas de flèches.

Alors, qu'est-ce que je fais de mal? Pourquoi les applications ont un bug avec un double-clic?

+0

est-il une question que vous vouliez poser ici ? –

+0

Thx, j'oublie d'écrire directement des questions Dans mon esprit j'ai des mauvaises connexions en cours d'exécution = des questions à ce sujet. dit poste :) –

Répondre

0

Alors, qu'est-ce que je fais mal? Pourquoi les applications ont un bug avec un double-clic?

Je pense que c'est la raison:

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

Notez que sur un seul clic gauche, mousePressEvent() retourne juste sans rien faire; Cela expliquerait pourquoi rien ne se passe quand vous faites un clic gauche. (Sur un double-clic, OTOH, mouseDoubleClickEvent() est appelé à la place, et puisque vous n'avez pas écrasé mouseDoubleClickEvent(), la méthode QGraphicsScene :: mouseDoubleClickEvent() est appelée et gère le clic ici

Je pense que vous veulent faire est plutôt ceci:.

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

    [...] 

de cette façon, QGraphicsScene :: mousePressEvent (mouseEvent) peut faire le travail de sélectionner l'élément que l'utilisateur a cliqué sur

+0

Merci l'homme! Je suis tellement stupide: D Ce travail est génial. Pour les générations futures: l'exemple peut induire en erreur parce que l'exemple d'utilisation 'naked' revient quand le mauvais bouton (mais déplace les éléments à) et le prochain cas de commutation pour créer un objet différent. Un peu étourdi. Merci encore :) –