Witam Wszystkich,
Chce zrobić zdjecia które będą reagowały na kilknięcie w Qt. Wiem jak zrobić zdjęcie w QLabel ale na QLabel nie ma sygnału kliknięcia. Szukając trochę w internecie znalazłem takie coś:
https://wiki.qt.io/Clickable_QLabel
Jednak po stworzeniu dwóch plików source i cpp, wkeljeniu w/w zawartosci i po dodaniu do pliku cpp include "mylabel.h" a do pliku .h include <QLabel>, include <QMouseEvent> oraz do pliku main.cpp #include"mylabel.h" program się nie kompiluje (dużo błędów wyskakuje). Biorąc pod uwage że kod kopiuje z oficjalnego wiki na pewno coś robię źle, czy mógłby ktoś wytłumaczyć krok po korku jak dojść do sygnału clicekd w QLabel ?
Dziękuję za pomoc : ).
Jest prosty sposób. Po prostu rozszerz klasę QLabel
: https://wiki.qt.io/Clickable_QLabel
A nie kompiluje się, bo prawdopodobnie w GUI nadal korzystasz ze starego QLabel zamiast z rozszerzonej klasy... ale bez konkretów od Ciebie to tylko mogę się domyślać.
Nie ma konkretów, nowy pusty projekt i tylko dodane te 2 pliki ( cpp i h )
Zmieniam w ui, klikam prawym -> zastap -> myqlabel
Dzięki temu filmikowi : doszedłem do tego że Mouse Area reguje na każde kliniecie, ale chce żeby reagowalo tylko na left click, czyli zrobiłem tak :
void MainWindow::Mouse_Pressed()
{
if(Qt::LeftButton)
{
ui->lblMouse_Current_Event->setText("Mouse Left Click");
}
else{
ui->lblMouse_Current_Event->setText("Mouse Pressed");
}
}
ale waunek nie działa : |
Dzięki temu filmikowi : doszedłem do tego że Mouse Area reguje na każde kliniecie, ale chce żeby reagowalo tylko na left click, czyli zrobiłem tak :
void MainWindow::Mouse_Pressed()
{
if(Qt::LeftButton)
{
ui->lblMouse_Current_Event->setText("Mouse Left Click");
}
else{
ui->lblMouse_Current_Event->setText("Mouse Pressed");
}
}
ale waunek nie działa : |
edit3:
poradziłem sobie zmienijąc w innym miejscu sprawdzenie przycisku:
void my_qlabel::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton){
emit Mouse_Pressed();
}
}
Q co nie tak jest z QPushButton
?
chce żeby reagowło na kliknięcie w obrazek : ). Z tą częścią programu sobie poradziłem, ale nie wiem co oznacza taki zapis:
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
może ktoś wytłumaczyć "łopatologicznie" ? : D
Cóż,jak to zasugerował Marek możesz użyć klasy QPushButton bez tekstu,ale za to z ikonką.Co prawda,to ma swoje minusy,np trzeba będzie wygląd tego przycisku dopieścić poprzez pochowanie cieni,no i wszelakie QStyle aplikacji będą brały te od QPushButtona.
Jeśli chcesz się oprzeć na klasie QLabel,to sposób A:
- dziedziczysz ją do swojej klasy i przeimplementowywujesz to
http://doc.qt.io/qt-4.8/qwidget.html#mouseReleaseEvent
z parametru *event wyciągniesz sobie różne przydatne rzeczy,jak np który przycisk myszy został wciśnięty.
Możesz użyć też mousePressEvent,wtedy Twój kod zareaguje od razu po wciśnięciu przycisku bez czekania na zwolnienie. - W Qt Designerze używasz opcji 'Promote Widget' na tych QLabelach,którym chcesz dodać Twoje zachowanie się na kliknięcie.
Sposób B:
Użyć http://doc.qt.io/qt-4.8/qobject.html#installEventFilter
Polega to na tym,iż tworzysz sobie oddzielny obiekt do obsługi logiki kliknięcia w QLabela tudzież inszy QWidget.
Zaletą rozwiązania B jest to,iż te filtry eventów można podpinać (i usuwać) pod obiekty dynamicznie,w trakcie działania programu.Poza tym będą działały nie tylko z QLabelem,ale każdym QWidgetem.