2012-02-13 15 views
5

Ostatnio chciałem, aby QPushButton mógł emitować sygnał po wejściu wskaźnika myszy. Jak mogę to zrobić?Jak emitować sygnał z QPushButton, gdy mysz na nim wisi?

Wiem, że QPushButton ma już zdefiniowany sygnał, taki jak clicked(), pressed(), destory() i tak dalej. Ale brak sygnału, jak hover(), enter(), ...

Sprawdziłem kilka informacji na ten temat: Ktoś powiedział, że można to zrobić za pomocą css. Nie rozumiem. Czy możesz mi doradzić ? Dziękuję Ci!

+0

Jeśli możesz wyjaśnić, co chciałbyś zrobić, gdy mysz jest unoszona, może nie być konieczne przechwycenie takiego zdarzenia. Jeśli na przykład chcesz zmienić wygląd przycisku, możesz to zrobić za pomocą arkusza stylów. –

+0

Dziękuję .. Chcę to zrobić: Jeśli istnieją dwa komponenty, Gdy wskaźnik myszy jest najechany na jeden, drugi jest niewidoczny ... –

+1

OK, ponieważ chcesz wpłynąć na przycisk oparty na interakcji myszy z innym przyciskiem, naprawdę musisz przechwycić to zdarzenie. –

Odpowiedz

7

Możesz użyć do tego celu QWidget::enterEvent (QEvent * event).

Przesłonisz to zdarzenie i wyślesz zdefiniowany sygnał, gdy zdarzy się to wydarzenie.

Najpierw należy włączyć śledzenie myszy dla tego widgetu (na przykład setMouseTracking(true) w konstruktorze).

plik nagłówka: plik

class my_button 
{ 
    // ... 

protected: 
    virtual void enterEvent(QEvent* e); 

public Q_SIGNALS: 
    void hovered(); 

    // ... 
}; 

Źródło:

void my_button::enterEvent(QEvent* e) 
{ 
    Q_EMIT hovered(); 

    // don't forget to forward the event 
    QWidget::enterEvent(e); 
} 

Jeżeli używasz przycisku:

connect(one_of_my_button, SIGNAL(hovered()), this, SLOT(do_something_when_button_hovered())); 
+0

, po pierwsze, dziękuję. Myślę, że jest to trochę skomplikowane, ponieważ używam jednego takiego przycisku, Czy istnieje inny sposób? –

1

Jeśli dobrze pamiętam, musisz włączyć śledzenie myszy dla przycisku (Qt documentation) i zastąpić QWidget::onEnter() i QWidget::onLeave().

Będziesz musiał utworzyć niestandardową klasę przycisków dziedziczącą po QPushButton. Możesz zdefiniować sygnały dla mouseEnter i mouseLeave w swojej klasie niestandardowej i emitować je metodami, które musisz przesłonić metodami onEnter() i .

+0

Czy trzeba nadpisać? Dziękuję za pomoc ... –

+1

Tak, musisz zaimplementować funkcje onEnter() i onLeave() w niestandardowej klasie przycisków. Zobacz odpowiedź @ Exa dla przykładu kodu. ps. proszę zagłosować, jeśli uznasz odpowiedź za przydatną – dirk

3

upewnij się, aby dodać ':' po słowie kluczowym publicznej

public: Q_SIGNALS: 
    void hovered(); 
6

Chociaż @Exa odpowiedział na to pytanie, chcę pokazać inne rozwiązanie, które nie wymaga podklasy QPushButton i jest elastyczne w użyciu! (Tego właśnie potrzebuję w moim projekcie)

Krok 1/2: Zastąpienie filtru zdarzeń.

LoginWindow.h:

// LoginWindow is where you placed your QPushButton 
//(= most probably your application windows) 

class LoginWindow: public QWidget 
{ 
public: 
     bool eventFilter(QObject *obj, QEvent *event); 
.. 
}; 

LoginWindow.cpp:

bool LoginWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    // This function repeatedly call for those QObjects 
    // which have installed eventFilter (Step 2) 

    if (obj == (QObject*)targetPushButton) { 
     if (event->type() == QEvent::Enter) 
     { 
     // Whatever you want to do when mouse goes over targetPushButton 
     } 
     return true; 
    }else { 
     // pass the event on to the parent class 
     return QWidget::eventFilter(obj, event); 
    } 
} 

Etap 2/2: Instalacja eventFilter na widżety docelowych.

+0

To jest bardzo dobra odpowiedź. Ale z jakiegoś dziwnego powodu, kiedy stosuję tę logikę na 'QToolButton' (dla pokazania niestandardowego wyskakującego tekstu nad nim), przycisk staje się niewidzialny, chociaż unosi się nad miejscem, w którym ma się objawić popup, i nawet kursor staje się wskaźnikiem zgodnie z oczekiwaniami, biorąc pod uwagę, że ustawiłem go w ten sposób dla przycisku! – SexyBeast

+0

Idealnie! Nie chciałem tworzyć nowej klasy dla każdego widżetu, dla którego chciałbym wykryć zdarzenia najechania! – BuvinJ

+2

@Cupidvogel Myślę, że znalazłem przyczynę. Zamiast 'return true' w funkcji' eventFilter' użyj 'return QWidget :: eventFilter (obj, event);' a także nie potrzebuje warunku else. Zrobiłem to i zniknął stan zniknięcia przycisku. – Volomike

Powiązane problemy