2013-03-27 56 views
5

私はmineseeperゲームのためのGUIを作成するためのQt Creatorの使用しています。 右クリックでクリックしたQpushButtonを知る方法はありますか?ゲームの旗のために。 他の言葉では、どの信号が右クリックに使用されていますか?Qtの右クリックのQPushButton

+0

あなたはおそらく 'イベントを()'オーバーライドして、信号を自分で放出する必要があります。 – rainer

+0

なぜ、誰か-1この質問?はい、もっと努力したかもしれませんが、問題は良いことです。良い答えのためにムハンマドに感謝します。 – zeFree

答えて

16

mousePressEventスロットでフィルタを使用して独自のボタンを作成します。

qrightclickbutton.h

#include "qrightclickbutton.h" 

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

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

は今、この

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

のように接続し

#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 MainWindow.cppのスロットを作成します。

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

それは私のために働く!

私はちょうどそれをサブクラス化する必要のない任意の既存のボタンを右クリック可能にするために、この小さなヘルパーアダプターを書いた
+0

誰かが一般的なclicked()シグナルとカスタムのrightClicked()シグナルの両方に接続したい場合は、オーバーライドされた 'mousePressEvent(QMouseEvent * e)の終わりで' QPushButton :: mousePressEvent(e); ' ) ' – Krzysiek

5

私はのQPushButtonは内部でのみマウスの左クリックを聞くために実装されると思います。しかし、簡単にQPushButtonを拡張して、マウスのリリースイベントと言って再実装することができます。

signals: 
    void rightClicked(); 

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

を...またはあなたがボタンの外で同じ検査を行うことができますので、MouseEventのポインタを転送クリックした信号のオーバーロードを作成することができます。たとえば、カスタムrightClicked()信号を発します。

signals: 
    void clicked(QMouseEvent *); 

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

次に、あなたはあなたにボタンのclicked(QMouseEvent *)信号を接続し、それに応じて進みスロットでチェックを行います。

+0

私は 'QPushButton'を使っていますが、' button() 'はありません。私は何をすべきか? – KhoC

+0

@KhoC何? 'button()'は 'QMouseEvent'のメソッドです。 – cmannett85

+0

私は 'mouseReleaseEvent'をどうすれば使うことができるのか分かりません。 'mouseReleaseEvent'で' rightClicked() 'をなぜ呼び出すのですか? – KhoC

2

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

使用法:

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

を今から、clicked信号意志を右クリックと左クリックによってトリガされます。このオブジェクトを削除する必要はありません - それは親としてui->pushButtonを使用していますし、親が破棄されるとはQtによって自動削除されます。

明らかに、新しい信号をここに宣言し、希望の場合はclickedの代わりに右クリックしてその信号を放出する2行のコードを書くことができます。

関連する問題