2014-04-23 7 views
0

J'ai un problème lorsque j'émets un signal dans un événement mouseMove, mais ce signal n'est pas reçu par un emplacement sur un autre objet tant que je n'ai pas relâché la souris.Qt Le signal ne parvient pas à la fente jusqu'à la libération de la souris

Détails: J'ai une classe appelée SelectableItem, qui QGraphicsObject sous-classes:

#pragma once 
#if !defined PARTS_SELECTABLE_ITEM_H 
#define PARTS_SELECTABLE_ITEM_H 

#include <QGraphicsObject> 

namespace Parts { 
class SelectableItem : public QGraphicsObject { 
    Q_OBJECT 
public: 
    SelectableItem(); 

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) = 0; 
    QRectF boundingRect() const = 0; 

    void SetIsSelectedCustom(bool b); 
    bool IsSelectedCustom(); 

    void SetIsSelectable(bool b); 
    bool IsSelectable(); 

    void SetIsHovering(bool b); 
    bool IsHovering(); 

    void Move(QPointF offset); 

signals: 
    void moveItem(QGraphicsSceneMouseEvent *e); 
    void deselectAllItems(); 
    void deselectItem(Parts::SelectableItem*); 
    void selectItem(Parts::SelectableItem*); 
    void stopSelectionDrag(); 
    void stopMovingParts(); 
    void deleteSelectedItems(); 

protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *e); 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *e); 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *e); 
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e); 
    void hoverEnterEvent(QGraphicsSceneHoverEvent *e); 
    void hoverLeaveEvent(QGraphicsSceneHoverEvent *e); 

    bool m_is_selected; 
    bool m_is_hovering; 
    bool m_is_selectable; 

}; // class SelectableItem 
} // namespace Parts 

#endif // PARTS_SELECTABLE_ITEM_H 

J'ai deux autres classes que la sous-classe la classe SelectableItem. Ils sont Part et Terminal

Partie:

#pragma once 
#if !defined PARTS_PART_H 
#define PARTS_PART_H 

#include "PartLabel.h" 
#include "PartDialog.h" 
#include "Terminal.h" 
#include "SelectableItem.h" 
#include <QGraphicsObject> 
#include <QGraphicsSvgItem> 
#include <QSvgRenderer> 
#include <map> 

namespace Parts { 

class Terminal; 
class Part : public SelectableItem { 
    Q_OBJECT 
public: 

    friend class PartLabel; 

    Part(); 
    ~Part(); 

    enum PartLabelLocation { 
     North, 
     South, 
     East, 
     West 
    }; 

    // Inherited Functions 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 
    QRectF boundingRect() const; 
    void setPos(qreal x, qreal y); 

    // Part Functions 
    void SetData(std::map<std::string, std::string> data); 
    void SetTerminals(std::list<Terminal*> terms); 
    void AddTerminalsToScene(QGraphicsScene* s); 
    void SetPartGraphic(QGraphicsSvgItem *svg); 
    void SetDialog(PartDialog *d); 
    std::string GetName(); 
    void SetName(const std::string &name); 
    void Move(QPointF offset); 
    PartLabel* GetLabel(); 
    std::map<std::string, std::string>* GetData(); 
    std::list<Terminal*> GetTerminalList(); 
    QPointF GetCenterPointPos(); 

    void SetLabelNorth(); 
    void SetLabelSouth(); 
    void SetLabelEast(); 
    void SetLabelWest(); 
    void ResetLabelPosition(); 

    QGraphicsSvgItem* GetPartSvg(); 

signals: 
    void partRotated(); 

private: 

    // Inherited Functions 
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e); 
    void hoverEnterEvent(QGraphicsSceneHoverEvent *e); 
    void hoverLeaveEvent(QGraphicsSceneHoverEvent *e); 
    void contextMenuEvent(QGraphicsSceneContextMenuEvent *e); 

    // Part Functions 
    void DrawTerminal(QPainter *painter, QPointF &point); 
    QRectF CalculateBoundingBox(); 
    void Initialize(); 
    void RotateCW(); 
    void RotateCCW(); 
    void OpenPropertiesDialog(); 
    void SinglePartContextMenu(QGraphicsSceneContextMenuEvent *e); 
    void MultiplePartContextMenu(QGraphicsSceneContextMenuEvent *e); 

    // Part Members 
    QGraphicsSvgItem *m_part_graphic; 
    std::map<std::string, std::string> m_data; 
    std::list<Terminal*> m_terminals; 
    QRectF m_bounding_box; 
    PartLabel *m_label; 
    PartDialog *m_dialog; 

    bool m_is_initialized; 

    int m_label_position; 

}; // class Part 
}; // namespace Parts 

#endif // PARTS_PART_H 

Terminal:

#pragma once 
#if !defined PARTS_TERMINAL_H 
#define PARTS_TERMINAL_H 

#define TERMINAL_RADIUS 15 
#define CONNECTED_TERMINAL_RADIUS 7.5 

#include "Part.h" 
#include "SelectableItem.h" 
#include <QGraphicsObject> 

namespace Parts { 
class Part; 
class Connection; 
class Terminal : public SelectableItem { 
    Q_OBJECT 
public: 
    enum TerminalDirection { 
     North, 
     East, 
     South, 
     West 
    }; 

    Terminal(const std::string &name, const QPointF &rel_coords, const std::string &direction); 

    // Inherited Functions 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 
    QRectF boundingRect() const; 

    QPointF GetRelativeCoord(); 
    QPointF GetConnectionCoord(); 
    void SetPart(Part *p); 
    bool HasPart(); 
    void Move(); 
    void RotateCW(); 
    void RotateCCW(); 
    void SetIsConnected(bool b); 
    bool IsConnected(); 

    void AddConnection(Connection *c); 
    void RemoveConnection(Connection *c); 
    std::list<Connection*> GetConnectionList(); 

signals: 
    void connectionBegun(Parts::Terminal *t); 
    void connectionCompleted(Parts::Terminal *t); 

private: 
    // Inherited Functions 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *e); 
    void hoverEnterEvent(QGraphicsSceneHoverEvent *e); 
    void hoverLeaveEvent(QGraphicsSceneHoverEvent *e); 
    //void contextMenuEvent(QGraphicsSceneContextMenuEvent *e); 

    void IncrementDirection(); 
    void DecrementDirection(); 

    QPointF m_rel_coords; 
    QPointF m_rotated_rel_coords; 

    bool m_is_connected; 

    int m_direction; 
    int m_rotation_angle; 

    QRectF m_bounding_rect; 
    Part *m_part; 
    std::string m_name; 
    std::list<Connection*> m_connections; 

}; // class Terminal 
} // namespace Parts 

#endif // PARTS_TERMINAL_H 

La fonction mouseMove de classe SelectableItem est comme suit:

void SelectableItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { 
    if(!m_is_selectable) 
     return; 

    if(m_is_selected) 
     emit moveItem(e); 
    else { 
     emit deselectAllItems(); 
     emit selectItem(this); 
    } 
} 

Le signal emit selectItem(this) est instantanément REÇU par un autre c lass SysGraphicsScene qui gère la sélection des articles. Le problème que j'ai est que la classe Part émet ce signal via sa classe de base et le signal est reçu par la classe SysGraphicsScene instantanément. Cependant, la classe Terminal émet ce signal via sa classe de base (SelectableItem, qui est la même classe de base que Part a.) Et le signal n'est pas reçu instantanément par SysGraphicsScene mais seulement après mouseReleased.

Je ne sais pas pourquoi deux classes dérivées fonctionneraient différemment. Des idées?

Répondre

0

Ugh a trouvé le problème. Certains de mes objets Terminal ne se connectaient jamais à des signaux quelque part. Je savais que ça devait être quelque chose de basique. :/

Questions connexes