2012-09-10 19 views
8

Tengo una ventana principal. En MainWindow tengo múltiples Qlabel. Ahora, necesito encontrar el QLabel hecho clic. Utilizando MousePressEvent, puedo hacer clic en la posición X() y Y() del mouse.Qt Cómo buscar un objeto en un widget usando la posición x() y y()

¿Cómo puedo usar esta Coordenada para identificar la QLabel?

¿Hay alguna función en QT para encontrar el Objeto cliqueado usando X() y Y() la coordenada ??

Respuesta

9

Desde QLabel es una subclase de QWidget, que puede manejar eventos de prensa ratón en QLabel :: mousePressEvent

virtual void mousePressEvent (QMouseEvent * ev) 

Pero en QMainWindow, puede utilizar childAt para obtener los widgets hijos en x, y

QWidget * QWidget::childAt (int x, int y) const 

QLabel* label= static_cast<QLabel*>(mainWindow->childAt(x,y)); 

Leer más en: http://doc.qt.io/qt-5/qwidget.html#childAt

+1

Gracias digitalSurgeon, traté de usar tu camino. Da la dirección a cambio. Significa en el modo de depuración, la etiqueta muestra la dirección "@ 819d4e8". Ahora, cómo usar esta dirección para identificar la etiqueta en la que se hizo clic. Por favor, dame algunas pautas más. – skg

+1

@skg lo que está recibiendo es un puntero a la etiqueta, por lo que no tiene que hacer cualquier otra cosa, puede llamar a las funciones de este puntero .. 'QLabel * label = static_cast (mainWindow-> childAt (x, y)); label-> setText ("Soy la etiqueta en la que hizo clic"); ' –

1

utilizar la función widgetAt dentro QApplication

QWidget *widget = qApp->widgetAt(x,y); 

que luego puedas dynamic_cast en QLabel.

+0

Gracias Ismail, ¿me pueden dar un poco más de idea? Intenté esto, da "0x0" cada vez para cualquier etiqueta. – skg

1

En lugar de tratar de identificar en qué etiqueta se ha hecho clic desde las coordenadas del mouse, también puede utilizar alternativamente el método mousePressEvent() de una etiqueta.

Por ejemplo, cree su propia clase de etiqueta sobrecargada y, en un mousePressEvent(), emita una señal clicked() que luego puede vincular a una ranura.

4

en QT5 esto también funciona

QTabBar *widget =(QTabBar*) qApp->widgetAt(QCursor::pos()); 
+0

+1 para el QCursor :: pos() que parece estar funcionando, mientras que QMouseEvent :: pos() no funciona para mí. – rsp1984

+0

Lo único que no es estricto que coincida con lo que quiero decir es que puede obtener cualquier puntero de QWidgets usando qbject_cast para obtener mejores resultados – Yash

Cuestiones relacionadas