2013-03-27 21 views
5

Używam Qt Creator do stworzenia gui dla gry mineseeper. Jak mogę sprawdzić kliknięcie przycisku QpushButton prawym przyciskiem myszy? do flagi w grze. Innymi słowy, który sygnał służył do kliknięcia prawym klawiszem?Qt rightclick QPushButton

+0

Prawdopodobnie będziesz musiał przesłonić 'event()' i samemu wysłać sygnał. – rainer

+0

Dlaczego ktokolwiek -1 to pytanie? Tak, mogło być więcej wysiłków, ale pytanie jest dobre. Dzięki Muhammadowi za dobrą odpowiedź. – zeFree

Odpowiedz

16

Utwórz własny przycisk z filtrem na gnieździe mousePressEvent.

qrightclickbutton.h

#ifndef QRIGHTCLICKBUTTON_H 
#define QRIGHTCLICKBUTTON_H 

#include <QPushButton> 
#include <QMouseEvent> 

class QRightClickButton : public QPushButton 
{ 
    Q_OBJECT 

public: 
    explicit QRightClickButton(QWidget *parent = 0); 

private slots: 
    void mousePressEvent(QMouseEvent *e); 

signals: 
    void rightClicked(); 

public slots: 

}; 

#endif // QRIGHTCLICKBUTTON_H 

qrightclickbutton.cpp

#include "qrightclickbutton.h" 

QRightClickButton::QRightClickButton(QWidget *parent) : 
    QPushButton(parent) 
{ 
} 

void QRightClickButton::mousePressEvent(QMouseEvent *e) 
{ 
    if(e->button()==Qt::RightButton) 
     emit rightClicked(); 
} 

teraz połączyć się ten

QRightClickButton *button = new QRightClickButton(this); 
ui->gridLayout->addWidget(button); 
connect(button, SIGNAL(rightClicked()), this, SLOT(onRightClicked())); 

utworzyć szczelinę w MainWindow.cpp.

void MainWindow::onRightClicked() 
{ 
    qDebug() << "User right clicked me"; 
} 

To działa dla mnie!

+0

Jeśli ktokolwiek chciałby połączyć() zarówno z ogólnym sygnałem clicked(), jak i niestandardowym sygnałem rightClicked() - konieczne jest wywołanie 'QPushButton :: mousePressEvent (e);' na końcu nadpisanego 'mousePressEvent (QMouseEvent * e) ' – Krzysiek

5

Myślę, że QPushButton został wewnętrznie zaimplementowany, aby słuchać tylko kliknięć lewym przyciskiem myszy. Ale możesz łatwo rozszerzyć QPushButton i ponownie zaimplementować, powiedzmy, wydarzenie myszy i wykonaj swoje zadanie, jeśli wciśnięty jest prawy przycisk myszy, np. emitują własnego rightClicked() sygnał na przykład:

signals: 
    void rightClicked(); 

protected: 
    void mouseReleaseEvent(QMouseEvent *e) { 
     if (e->button() == Qt::RightButton) emit rightClicked(); 
     else if (e->button() == Qt::LeftButton) emit clicked(); 
    } 

... albo można utworzyć przeciążenie klikniętego sygnału, który przekazuje wskaźnik MouseEvent więc można zrobić to samo sprawdzanie poza przyciskiem.

signals: 
    void clicked(QMouseEvent *); 

protected: 
    void mouseReleaseEvent(QMouseEvent *e) { 
     emit clicked(e); 
    } 

Następnie należy wykonać kontrolę w gnieździe podłączeniu clicked(QMouseEvent *) sygnał tego przycisku, aby kontynuować i odpowiednio.

+0

Używam 'QPushButton' i nie ma w tym przycisku' button() '. co powinienem zrobić? – KhoC

+0

@KhoC Co? 'button()' jest metodą 'QMouseEvent'. – cmannett85

+0

, więc nie wiem, jak mogę użyć 'mouseReleaseEvent'. dlaczego nazywacie 'rightClicked()' w 'mouseReleaseEvent'? – KhoC

2

Właśnie napisał ten mały zasilacz pomocniczy do żadnego istniejącego Prawy przycisk klikalne bez konieczności jej podklasy:

class CRightClickEnabler : public QObject 
{ 
public: 
    CRightClickEnabler(QAbstractButton * button): QObject(button), _button(button) { 
     button->installEventFilter(this); 
    }; 

protected: 
    inline bool eventFilter(QObject *watched, QEvent *event) override { 
     if (event->type() == QEvent::MouseButtonPress) 
     { 
      auto mouseEvent = (QMouseEvent*)event; 
      if (mouseEvent->button() == Qt::RightButton) 
       _button->click(); 
     } 
     return false; 
    } 

private: 
    QAbstractButton* _button; 
}; 

Zastosowanie:

connect(ui->pushButton, &QPushButton::clicked, [](){qDebug() << "Button clicked";}); 
new CRightClickEnabler(ui->pushButton); 

Od teraz, sygnał clicked będzie być wyzwalane przez kliknięcie prawym przyciskiem myszy oraz kliknięcie lewym przyciskiem myszy. Nie ma potrzeby usuwania tego obiektu - korzysta on z ui->pushButton jako rodzic i zostanie automatycznie usunięty przez Qt, gdy rodzic zostanie zniszczony.

Oczywiście, można napisać 2 linie kodu (dosłownie), aby zadeklarować tutaj nowy sygnał i emitować ten sygnał po kliknięciu prawym przyciskiem myszy zamiast clicked, w razie potrzeby.

Powiązane problemy