Qt - QEvent - do czego można to wykorzystać ?

0

Yo - mam do was pytanie. W Qt jest taka klasa jak QEvent - oprócz tego, że można za pomocą zdarzeń pobierać znaki z klawiatury - to chciałbym zadać takie pytanie - do czego tak naprawdę można wykorzystać tą klasę ? Poda z was ktoś przykłady ?

2

Proponuje zacząć od dokumentacji https://doc.qt.io/qt-5/eventsandfilters.html

Możesz zdefiniować wlasne klasy dziedziczace po QEvent , dodać w środku jakiś "pakunek" i rozsyłać to pomiędzy obiektami (sendEvent / postEvent )

0

Wiem, że teraz wypłynę na bardzo głębokie wody mając na uwadze swój poziom ale czy ktoś z was wie lub czy ktoś z was robił niestandardowe widgety ? Bo podobno QEvent odpowiada za tworzenie niestandardowych widgetów. Czy ktoś z was szkieletowo opisałby jak robi się niestandardowe widgety ?

2

Nie zaczynamy programowania od pisania nowego systemu operacyjnego w asemblerze.
Zacznij poznawanie Qt od przykładów https://doc.qt.io/qt-5/examples-widgets.html ,
na początek najlepszy jest Qt Creator
image

0

pozwól że cie wprowadzę, zkubinski jest tu znany. 1,5 roku nie mógł napisać(i dalej nie napisał) czytnika jego jsonów. Okazało się że winna jest słaba dokumentacja QT, ogólnie jego słaba architektura no i użytkownicy 4p. On chyba w paru działach nawet 4p działał. Bo i pythona czy c# próbował. Ale zawsze wina microsoftu czy innego teamu że mu się nie udaje. Możesz dać mu milion linków i tak nie przeczyta

@revcorey - szczerze ? Napisałem JSON-a - napisałem też w pełni działający w miarę sensowny program działający na bazie danych oparty o "model-widok" i wierz mi, że dokumentacja nie jest idealna, bo żeby napisać ten program, to dużo rzeczy jest porozrzucanych i musiałem łączyć w całość te porozrzucane zlepki informacji - dokumentacja nie jest idealna, weźmy na przykład taką instalację sterownika do bazy danych SQL wszystkie kroki są opisane poniekąd dobrze, bo poprawnie wszystko się robi ale z jakiegoś powodu to nie działa bo jest kilka niedomówień - i nikt w tej dokumentacji nie napisał aby to zadziałało, to trzeba "*.dll-ki" umieścić w katalogu "C:\Windows\system32", po drugie trzeba dodać kilka zmiennych środowiskowych itp itd... czyli ktoś kto czyta dokumentację ma sobie to wywróżyć ? Ma przeczytać w myślach autorowi co miał na myśli ? - brakuje tej drobnej rzeczy, może gdzieś ta informacja jest ale musiałem się jej domyśleć... - to tylko wierzchołek góry lodowej, większość rzeczy opisane jest naprawdę lakonicznie. Rozumiem, że programistom nie chce się pisać dokumentacji ale ja jestem zwolennikiem, że jak już coś robię, to staram się to robić naprawdę dobrze, a nie na odwal się byle było.

Więc puenta jest taka - jeżeli dokumentacja jest taka doskonała, to dlaczego są filmiki na YT uczące programowania w Qt ? Czy doskonale dobra dokumentacja potrzebowałaby filmików instruktażowych ? Czy jednak coś z tą dokumentacją jest nie tak ? Wybacz ale twoja logika jako programisty jest kiepska, jeżeli nie potrafisz wyciągnąć wniosków innych niż "jest dobrze", to skoro jest "dobrze" to czemu jest tak źle ? Skoro jest wysyp tutoriali, filmików i innych samouczków w całej sieci. Według twojego toku myślenia sama dokumentacja powinna wystarczyć, a jednak setkom innych ludzi nie wystarcza i zadają pytania na wielu różnych forach

0
zkubinski napisał(a):

... słuchaj, nie znasz mnie więc nie oczerniaj mojej osoby ...

Ależ skąd, bardzo dobrze zna, ja też jak zresztą wszyscy na tym forum, poza tym jak nazywasz deklarację faktów - oczernieniem to jak powiedziano wcześniej "chłopaku zastanów się głęboko nad sobą" - co całkowicie popieram.

zkubinski napisał(a):

... to po co robisz wycieczki osobiste ?

Moment wróciłeś po dłuższym BAN'ie i od czego zacząłeś (za co dostałeś kolejnego kilkudniowego BAN'a)?

zkubinski napisał(a):

... to po co jest forum, nie lepiej w tym przypadku je zamknąć?

Tak wg mnie trzeba zamknąć ale tylko dla ciebie, na zawsze. Zobacz dostałeś odpowiedź wręcz genialną cała lista przykładowych Widgetów ze źródłami - sapienti sat! Ale ty nawet nie oznaczyłeś tą odpowiedź jako pożyteczną zaś zacząłeś się wykłócać nie wiadomo o co.

0

@_13th_Dragon:
ok, może inaczej, może podpowiesz ?

zrobiłem swojego buttona dziedziczącego po QPushButton i napisałem sobie takie oto zdarzenie

bool MyButton::event(QEvent *ev)
{
    if(ev->type()==QEvent::HoverEnter){
        qDebug()<<"Enter";
    }
    if(ev->type()==QEvent::HoverLeave){
        qDebug()<<"Leave";
    }
    return QPushButton::event(ev);
}

zdarzenie działa i pytanie jest takie - ideałem byłoby gdybyś podał rozwiązanie jak zmienić kolor buttona gdy najadę na niego myszką, mogę też się zadowolić podpowiedzią

2

W enter i leave ustawiasz kolor (lub flagę) w zmiennej klasy i wywołujesz repaint: https://doc.qt.io/qt-5/qwidget.html#repaint-1
Oraz obsługujesz rysowanie przycisku: https://forum.qt.io/topic/86500/understanding-paintevent
dictum sapienti sat ...

0

@_13th_Dragon:
zrobiłem coś takiego

bool MyButton::event(QEvent *ev)
{
    if(ev->type()==QEvent::HoverEnter){
    
        this->setAutoFillBackground(true);
        QPalette p;
        p.setColor(QPalette::Button,QColor(Qt::green));
        this->setPalette(p);
        
        qDebug()<<"Enter";
    }
    if(ev->type()==QEvent::HoverLeave){
        qDebug()<<"Leave";
    }
    return QPushButton::event(ev);
}

ale niestety pojawia mi się tylko zielona ramka. Jest kilka sposobów na ustawienie koloru ale nie wiem który jest ten właściwy. Bo niby w dokumentacji jest flaga QPalette::Button i QPalette::Window

Co do funkcji repaint to nie chce mi działać i nie wiem co robię źle

@revcorey:

najpierw to zajrzyj do dokumentacji QPushButton a nawet konkretniej wyżej w hierarchi dziedziczenia

cały czas patrzę na klasę QWidget bo w sumie wszystkie widgtety po tej klasie dziedziczą

0

Dobra, udało mi się zmienić kolor buttona po najechaniu na niego myszą. Cała tajemnica tkwi w tym aby ustawić styl za pomocą setStyle

czyli kod wygląda tak

plik main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("Fusion"); //ustawiam jakiś styl
    Widget w;
    w.show();
    return a.exec();
}

część pliku button.cpp

bool MyButton::event(QEvent *ev)
{
    if(ev->type()==QEvent::HoverEnter){
    
        QPalette p;
        p.setColor(QPalette::Button,QColor(Qt::green));
        setPalette(p);

        QFont font = this->font();
        font.setBold(true);
        this->setFont(font);

        qDebug()<<"Enter";
    }
    if(ev->type()==QEvent::HoverLeave){

        QPalette p;
        p.setColor(QPalette::Button,QColor(Qt::red));
        setPalette(p);
        
        QFont font = this->font();
        font.setBold(false);
        this->setFont(font);

        qDebug()<<"Leave";
    }
    return QPushButton::event(ev);
}

zrzuty
Przed najechaniem myszą
screenshot-20220525114822.png

po najechaniu myszą
screenshot-20220525114908.png

gdy myszką odjeżdżam z buttona
screenshot-20220525114958.png

0

Kontynuując wątek, to już chyba doszedłem jak zrobić niestandardowe widgety za pomocą Event-ów

Wystarczy użyć funkcji virtualnej paintEvent w tej funkcji można ustawiać wielkość buttona (ogólniej każdego widgetu), kolory i inne pierdoły - jeżeli się mylę, to proszę o wyprowadzenie mnie z błędu

3

To jest ekstremalny przypadek problemu XY.
Zadałeś jakieś totalnie abstrakcyjne pytanie o QEvent (tytuł wątku to Qt - QEvent - do czego można to wykorzystać ?), a nagle sam sobie odpowiadasz jakby problemem była zmiana wyglądu guzika.

0

@MarekR22:
zgoda - zadałem bardzo ogólne pytanie, tylko, że nie dostałem żadnej konkretnej odpowiedzi na zadane pytanie - nikt nie podał przykładów, bo w sumie takie było pytanie.

Z braku odpowiedzi postanowiłem coś poszukać i zaprogramować JEDEN Z wymyślonych przeze mnie prostych PRZYKŁADÓW, opublikowałem go tutaj w nadziei, że ktoś podsunie inne przykłady zastosowania QEvent abym mógł się rozeznać do czego w sumie to służy i jak tego używać

W zamian za to, zostałem zmieszany z błotem bo wy jako mający dużo większą wiedzę, zamiast odnieść się do sedna sprawy, to jeden z was porusza kwestie ile lat jestem na tym forum, tak jakby to miało największe znaczenie w zadanym przeze mnie pytaniu ale przecież pytanie nie było o tym ile tu jestem zarejestrowany - więc nikt z was nie podał ŻADNEGO przykładu, to na dodatek dostałem odnośnik do dokumentacji... no nie taki był cel pytania aby być zbluzganym i otrzymać odnośnik do dokumentacji - raczej liczyłem na jakąś sensowną wymianę zdań żeby się czegoś dowiedzieć i spróbować zrozumieć czym to jest, no nie dowiedziałem się od was nic, więc sam poszukałem jakiś pierwszy lepszy przykład z brzegu i postanowiłem się nim pobawić, taka zabawa zaprowadziła mnie do zrozumienia niektórych rzeczy i zacząłem rozwijać wątek i przy okazji napotkane problemy - zaznaczam, że to co poruszyłem to jest jedna kwestia zastosowania QEvent - chciałbym, żeby wątek był naprawdę przydatny, to fajnie by było aby ktoś opublikował inne przykłady z życia wzięte (nie z dokumentacji) tak aby rozeznać się i mieć przykłady zastosowania - no ale nie, tu jednak panuje pewna biurokracja, idź do dokumentacji albo poszukaj w google, a najlepiej gdyby ludzie sobie stąd poszli

3

Zadałeś pytanie, na które nie ma jednoznaczne odpowiedzi. Równie dobrze mógłbyś zapytać do czego można wykorzystać std::vector lub std::sort. Dostałeś link do dokumentacji, gdzie wypisane są wszystkie eventy wysyłane przez Qt (jest nawet czytelna lista), ich ewentualne zastosowanie musisz sobie wymyślić sam.

Przy czym imo taki sposób nauki jest bez sensu - co też mówiłem ci już kilka lat temu jak zadawałeś podobnie skonstruowane pytania. Jeśli podczas pisania projektu nadejdzie potrzeba użycia QEvent, to w oparciu o dokumentację będzie to bardzo prosta rzecz.

0

zapytam w tym wątku o jeszcze jedną rzecz - bawię się funkcją paintEvent dla podklasowanej klasy MyButton która dziedziczy po QPushButton

gdy chcę narysować prostokąt używając funkcji QPainter.drawRect(rect) bo chcę spróbować zrobić swój niestandardowy widżet buttona - to otrzymuję część kwadratu i jak go przesuwam to wcale go nie widać - pytanie jest takie - dlaczego i jak zrobić to poprawnie ?

kod wygląda tak:

w klasie button.h

#include <QPushButton>
#include <QObject>
#include <QWidget>
#include <QEvent>
#include <QHoverEvent>
#include <QPalette>
#include <QPainter>

class MyButton : public QPushButton
{
    Q_OBJECT

public:
    MyButton(QWidget *parent=nullptr);

private:
    QPalette backgroundButton;

    void buttonHover(QHoverEvent *ev);
    void paintEvent(QPaintEvent *ev) override;
    bool event(QEvent *) override;
};

w pliku button.cpp

void MyButton::paintEvent(QPaintEvent *ev)
{
    qDebug()<< ev->rect();

    QPainter paint(this);

    paint.drawRect(0,0,80,24);

    paint.drawText(10,10, "Wciśnij mnie");
}

zrzut ekranu
screenshot-20220526091324.png

1

Zwyczajnie możesz rysować tylko w obrębie tegoż przycisku.

0

@Adamek Adam:

przydal by sie kompletny przyklad na github

Przykład jest tutaj

kod jest jaki jest - w przykładach nie dbam o niego

0

Jak bym chciał zrobić własny Widget to bym zaczał do przykladów Qt
https://doc.qt.io/qt-5/qtwidgets-widgets-analogclock-example.html
https://doc.qt.io/qt-5/qtwidgets-painting-basicdrawing-example.html

Na razie nie jest oczywiste co chcesz uzyskać, bo np. okrągły button można zrobić stylem

1 użytkowników online, w tym zalogowanych: 0, gości: 1