2010-12-03 7 views
7

Ich googelte herum und fand this forum thread, in dem das OP das genaue Problem zu haben scheint, das ich habe. Die Frage ist, wie würde ich von QLabel erben und das mousepressed Ereignis neu implementieren? Ich vermute, es wäre so etwas wie dieses:Die Mausklickposition eines Etiketts in Qt bekommen

class CustomLabel : public QLabel 
{ 
public: 
    //what about the constructors? 
    void mousePressEvent (QMouseEvent * ev); 
} 

void CustomLabel::mousePressEvent (QMouseEvent * ev) 
{ 
    QPoint = ev->pos(); 
    //I want to have another function get the event position. 
    //How would I achieve this? It's void! 
    //Is there perhaps some way to set up a signal and slot with the position? 
} 

Und nachdem ich erfolgreich eine CustomLabel Klasse erstellt haben, wie würde ich in der Lage sein, es in der Entwurfsansicht zu setzen?

+0

Haben Sie die zweite Lösung das Etikett wieder in das Hauptfenster des Setzens? – arqam

Antwort

9

Ja, können Sie ein Signal auf Ihre CustomLabel Klasse einrichten und haben Ihre überschriebene Version von mousePressEvent es emittieren. d.h.

class CustomLabel : public QLabel 
{ 
Q_OBJECT 
signals: 
    void mousePressed(const QPoint&); 

public: 
    CustomLabel(QWidget* parent = 0, Qt::WindowFlags f = 0); 
    CustomLabel(const QString& text, QWidget* parent = 0, Qt::WindowFlags f = 0); 

    void mousePressEvent(QMouseEvent* ev); 
}; 

void CustomLabel::mousePressEvent(QMouseEvent* ev) 
{ 
    const QPoint p = ev->pos(); 
    emit mousePressed(p); 
} 

CustomLabel::CustomLabel(QWidget * parent, Qt::WindowFlags f) 
    : QLabel(parent, f) {} 

CustomLabel::CustomLabel(const QString& text, QWidget* parent, Qt::WindowFlags f) 
    : QLabel(text, parent, f) {} 

Die Konstruktoren imitieren nur diejenigen der Basis QLabel und deshalb einfach ihre Argumente direkt an die entsprechenden Basis Konstruktoren passieren.

+0

Wie würde ich ein solches benutzerdefiniertes Label zur Designansicht hinzufügen? – wrongusername

+0

@wrongusername: Ich fürchte, ich weiß nicht, wie ich das tun soll. Es tut uns leid. – Troubadour

+0

es ist in Ordnung, keine Sorge, ich habe stattdessen einen Event-Filter verwendet – wrongusername

1

Ist es nur ich, oder gibt QMouseEvent bereits die Informationen, die Sie brauchen?

int QMouseEvent :: x() const

Gibt die x-Position des Mauszeigers, bezogen auf das Widget, der das Ereignis empfangen.

Siehe auch y() und pos().

int QMouseEvent :: y() const

Gibt die Y-Position des Mauszeigers, bezogen auf das Widget, der das Ereignis empfangen.

Siehe auch x() und pos().

Ref: http://doc.qt.nokia.com/4.7.old/qmouseevent.html#x

+0

Oh okay, Entschuldigung! Wie würde ich wissen, ob es einen Mausklick gibt und dann die Position bekommen? – wrongusername

1

wie folgt aus: D

void CustomLabel::mousePressEvent(QMouseEvent *ev) 
{ 
QString x = QString::number(ev->x()); 
QString y = QString::number(ev->y()); 
qDebug() << x << "," << y; 
}