2013-03-27 14 views
5

Sto usando Qt Creator per creare una GUI per un gioco mineseparto. Come posso sapere che un QpushButton ha fatto clic con rightclick? per la bandiera nel gioco. In altre parole, quale segnale viene usato per rightclick?Qt rightclick QPushButton

+0

Probabilmente avrete bisogno di sovrascrivere 'event()' ed emettere il segnale da soli. – rainer

+0

Perché qualcuno -1 questa domanda ?? Sì, ci sarebbero stati più sforzi, ma la domanda è buona. Grazie a Muhammad per una buona risposta. – zeFree

risposta

16

Crea il tuo pulsante con filtro a mouseStampo PressEvent.

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(); 
} 

Ora collegare in questo modo

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

Creare uno slot in mainwindow.cpp.

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

Funziona per me!

+0

Se qualcuno desidera connettersi() sia al segnale generico cliccato() che al segnale personalizzato rightClicked() - è necessario chiamare 'QPushButton :: mousePressEvent (e);' alla fine di overridden 'mousePressEvent (QMouseEvent * e) ' – Krzysiek

5

Penso che QPushButton sia implementato internamente per ascoltare solo i clic del mouse sinistro. Ma puoi facilmente estendere QPushButton e ri-implementare diciamo l'evento di rilascio del mouse e fare la tua cosa se il pulsante destro del mouse è stato premuto, ad es. emettere un segnale rightClicked() personalizzato per esempio:

signals: 
    void rightClicked(); 

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

... oppure è possibile creare un sovraccarico del segnale cliccato che inoltra il puntatore mouseEvent modo da poter fare lo stesso controllo al di fuori del pulsante.

signals: 
    void clicked(QMouseEvent *); 

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

Poi si fa il check-in slot di collegare il segnale del tasto clicked(QMouseEvent *) per e procedere di conseguenza.

+0

Sto usando 'QPushButton' e non ci sono' button() 'in questo. cosa dovrei fare? – KhoC

+0

@ KhoC Cosa ?? 'button()' è un metodo di 'QMouseEvent'. – cmannett85

+0

quindi non so come posso usare 'mouseReleaseEvent'. perché chiami 'rightClicked()' in 'mouseReleaseEvent'? – KhoC

2

Ho appena scritto questo adattatore piccolo aiutante per fare qualsiasi pulsante esistente destro cliccabile senza la necessità di creare una sottoclasse esso:

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; 
}; 

Usage:

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

Da ora in poi, il segnale clicked sarà essere attivato dal clic destro e sinistro del mouse. Non è necessario eliminare questo oggetto: utilizza ui->pushButton come genitore e verrà eliminato automaticamente da Qt quando il genitore viene distrutto.

Ovviamente, è possibile scrivere 2 righe di codice (letteralmente) per dichiarare un nuovo segnale qui ed emettere quel segnale con il tasto destro invece di clicked, se lo si desidera.

Problemi correlati