2010-12-03 15 views
7

Busqué en Google y encontré this forum thread en el cual el OP parece haber tenido el problema exacto que estoy teniendo. La pregunta es, ¿cómo heredaría de QLabel y volvería a implementar el evento presionado por el mouse? Supongo que sería algo como esto:Obteniendo la ubicación del clic del mouse de una etiqueta en qt

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? 
} 

Y después de haber creado con éxito una clase CustomLabel, ¿cómo iba a ser capaz de ponerlo en vista de diseño?

+0

le parecen la segunda solución de poner la etiqueta de nuevo a la ventana principal? – arqam

Respuesta

9

Sí, puede configurar una señal en su clase CustomLabel y tener su versión sustituida de mousePressEvent emitirla. es decir

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

Los constructores solo son similares a los de la base QLabel y por lo tanto simplemente pasan sus argumentos directamente a los constructores de base correspondientes.

+0

¿Cómo agregaría una etiqueta personalizada a la vista de diseño? – wrongusername

+0

@wrongusername: me temo que no sé cómo hacerlo. Lo siento. – Troubadour

+0

está bien, no se preocupe, terminé usando un filtro de eventos en su lugar – wrongusername

1

¿Soy solo yo, o no QMouseEvent ya le doy la información que necesita?

int QMouseEvent :: x() const

Devuelve la posición x del cursor del ratón, en relación con el widget que recibió el evento.

Vea también y() y pos().

int QMouseEvent :: y() const

Devuelve la posición y del cursor del ratón, en relación con el widget que recibió el evento.

Ver también x() y pos().

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

+0

¡Oh bien, lo siento! ¿Cómo sabría si hay un clic de ratón y luego obtener el puesto? – wrongusername

1

como este: D

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