2010-12-09 3 views
2

OS :: win_xp_sp3Problem mit QMouseEvent in QRect

Qt :: 4.6

Ist es möglich, QMouseEvent innerhalb QRect zu benutzen? Ich habe Eltern-Widget und im Inneren ist einige QLabel mit Text "Status unverändert".

Auch im übergeordneten Widget ist MyRect, die von QRect abgeleitet ist.

Jetzt möchte ich MouseEvent nur in diesem MyRect handeln. Wenn ich beispielsweise MyRect aktiviere, muss der Text im übergeordneten Widget geändert werden.

Zum Beispiel:

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

} 

nichts passiert

Frage :: ist es möglich, QMouseEvent wie folgt aus (nur auf QRect) zu benutzen?

Antwort

7

Ein QRect ist weder ein QObject noch ein QWidget, daher werden keine Ereignisse empfangen. Es sind nur vier Zahlen, die ein Rechteck beschreiben (und es ist nicht sinnvoll, daraus abzuleiten). Sie können überprüfen, ob ein Punkt in dem Maus-Ereignishandler Ihres Widgets der richtige ist. Wie:

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

Eine Alternative zu Subclassing ist using an event filter.

2

ist es möglich, QMouseEvent wie folgt zu verwenden (nur bei QRect)?

Nein, zumindest nicht wie Sie es tun. QRect ist kein QWidget und hat daher keine mouseEvent Handler und so. Es ist nur eine Entität mit vier Koordinaten.

Sie können tun, was Sie wollen, indem Sie einen Handler zu einem echten QWidget hinzufügen (entweder durch Unterklassen oder installEventFilter) und im Handler prüfen, ob Sie in Ihr Rechteck klicken, indem Sie QRect::contains(QPoint) verwenden.

+0

danke. sehr hilfreich –