2012-09-10 7 views
8

Mam MainWindow. W MainWindow mam wiele Qlabel. Teraz muszę znaleźć kliknięte QLabel. Używając MousePressEvent, mogę uzyskać klikniętą pozycję myszy X() i Y().Qt Jak znaleźć obiekt na widgecie za pomocą pozycji x() i y()

Jak mogę użyć tej współrzędnościowej do identyfikacji QLabel ??

Czy istnieje dowolna funkcja w QT, aby znaleźć obiekt kliknięty przy użyciu współrzędnych X() i Y()?

Odpowiedz

9

Od QLabel jest podklasą QWidget można obsługiwać zdarzenia prasowych mysz w QLabel :: mousePressEvent

virtual void mousePressEvent (QMouseEvent * ev) 

Ale w QMainWindow, można użyć childAt uzyskać widżety dziecko w X, Y

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

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

Czytaj więcej na: http://doc.qt.io/qt-5/qwidget.html#childAt

+1

Dzięki DigitalSurgeon, próbowałem użyć twojej drogi. W zamian daje adres. Środki w trybie debugowania, etykieta pokazuje adres "@ 819d4e8". Teraz, jak używać tego adresu do identyfikowania klikniętej etykiety. Proszę podać mi więcej linii pomocniczych. – skg

+1

@skg to, co otrzymujesz, jest wskaźnikiem do etykiety, więc nie musisz robić nic innego, możesz wywoływać funkcje na tym wskaźniku. 'Etykieta QLabel * static_cast (mainWindow-> childAt (x, y)); etykieta-> setText ("Jestem etykietą, którą kliknąłeś"); ' –

1

Użyj funkcji widgetAt wewnątrz QApplication

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

które następnie możesz dynamic_cast do QLabel.

+0

Dzięki Ismail, czy możesz dać mi trochę więcej pomysłu? Próbowałem tego, daje "0x0" za każdym razem dla każdej etykiety. – skg

1

Zamiast próbować określić, która etykieta została kliknięta ze współrzędnych myszy, można również użyć metody etykiety: mousePressEvent().

Na przykład utwórz własną, przeciążoną klasę etykiet, a na urządzeniu mousePressEvent() wyślij sygnał o wartości clicked(), który można następnie połączyć z gniazdem.

4

W Qt5 to działa również

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

+1 dla QCursor :: pos(), który wydaje się działać, natomiast QMouseEvent :: pos() nie działa dla mnie. – rsp1984

+0

Jedyna rzecz, która nie jest ściśle zgodna z tym, co rozumiem, to że dowolny wskaźnik QWidget może użyć funkcji qbject_cast w celu uzyskania lepszych wyników – Yash

Powiązane problemy