2013-03-27 41 views
5

我正在使用Qt Creator为mineseeper游戏创建一个gui。 我怎样才能知道用右键单击的QpushButton?为游戏中的国旗。 换句话说,哪个信号用于右击?Qt rightclick QPushButton

+0

您可能需要重写'event()'并自己发出信号。 – rainer 2013-03-27 12:15:16

+0

为什么有人-1这个问题?是的,可能会有更多的努力,但问题是好的。感谢穆罕默德提供了一个很好的答案。 – zeFree 2013-04-09 22:44:53

回答

16

用筛选器创建您自己的按钮,位于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(); 
} 

现在象这样连接

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

创建MainWindow.cpp插槽。

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

它适合我!

+0

如果有人想连接()到通用clicked()信号和自定义rightClicked()信号 - 有必要在重载的'mousePressEvent(QMouseEvent * e)末尾调用'QPushButton :: mousePressEvent(e) )' – Krzysiek 2016-04-24 15:51:51

5

我认为QPushButton是内部实现的,只能听左键单击。但是您可以轻松扩展QPushButton并重新实现让我们说鼠标释放事件,并在按下鼠标右键时执行您的操作。发出定制rightClicked()信号,例如:

signals: 
    void rightClicked(); 

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

...或者你可以创建一个转发的MouseEvent指针,以便你可以做的按钮之外相同的检查被点击的信号过载。

signals: 
    void clicked(QMouseEvent *); 

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

然后,你做你的按钮的clicked(QMouseEvent *)信号连接并进行相应处理槽的检查。

+0

我正在使用'QPushButton',并且没有'button()'。我该怎么办? – KhoC 2013-03-27 12:40:10

+0

@KhoC什么? 'button()'是'QMouseEvent'的一个方法。 – cmannett85 2013-03-27 12:58:08

+0

所以我不知道如何使用'mouseReleaseEvent'。为什么在'mouseReleaseEvent'中调用'rightClicked()'? – KhoC 2013-03-27 13:01:28

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自动删除。

很显然,如果需要,您可以编写2行代码(字面上)来声明新信号,并在右击时发出该信号,而不是clicked