2010-12-09 30 views
2

OS :: win_xp_sp3QMouseEvent dans QRect

Qt :: 4.6

Est-il possible d'utiliser QMouseEvent l'intérieur QRect? J'ai un widget parent et à l'intérieur est un QLabel avec le texte "status unchanged".

De même, le widget parent interne est MyRect qui est dérivé de QRect.

Maintenant je veux que MouseEvent agisse seulement dans ce MyRect. Par exemple, si j'agis sur MyRect, le texte du widget parent doit être modifié.

Par exemple:

class MyRect : public QRect { 
     public: 
     MyRect(int x, int y, int w, int h, ParentWidget* parent) 
      : QRect(x,y,w,h) 
      { 
       itsParent = parent; 
      } 
     ~MyRect() {} 

     protected: 
     void mouseMoveEvent(QMouseEvent* event) 

     private: 
     ParentWidget* itsParent 

    }; 

void MyRect::mouseMoveEvent(QMouseEvent* event) 
{ 
    if(event->buttons() == Qt::LeftButton) 
    { 
     itsparent->label->setText("status changed"); 
    } 

} 

rien ne se passe

question :: est-il possible d'utiliser QMouseEvent comme celui-ci (uniquement sur QRect)?

Répondre

7

Un QRect n'est ni un QObject ni un QWidget, il ne reçoit donc pas d'événements. Ce ne sont que quatre nombres décrivant un rectangle (et cela n'a aucun sens d'en dériver). Vous pouvez vérifier si un point est le rect donné dans le gestionnaire d'événements de souris de votre widget. Comme:

void MyLabel::mouseMoveEvent(QMouseEvent* e) { 
    if (!rect.contains(e->pos())) 
     return; 
    //... handle mouse move 
} 

Une alternative à subclassing est using an event filter.

2

est-il possible d'utiliser QMouseEvent comme ceci (seulement sur QRect)?

Non, au moins pas comment vous le faites. QRect n'est pas un QWidget et n'a donc aucun gestionnaire mouseEvent et autres. C'est juste une entité avec quatre coordonnées.

Vous pouvez faire ce que vous voulez en ajoutant un gestionnaire à un vrai QWidget (soit par sous-classe, ou en utilisant installEventFilter) et dans le gestionnaire de vérifier pour cliquer dans votre rectangle en utilisant QRect::contains(QPoint).

+0

merci. très utile –