Qt Creatorを使用して、地雷除去ゲームのGUIを作成しています。右クリックでクリックされたQpushButtonを知るにはどうすればよいですか?ゲームの旗のために。言い換えれば、右クリックに使用される信号はどれですか?
4 に答える
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";
}
わたしにはできる!
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();
}
...または、マウスイベントポインタを転送するクリックされた信号のオーバーロードを作成して、ボタンの外側で同じチェックを実行できるようにすることができます。
signals:
void clicked(QMouseEvent *);
protected:
void mouseReleaseEvent(QMouseEvent *e) {
emit clicked(e);
}
次に、ボタンのclicked(QMouseEvent *)
信号を接続するスロットでチェックを行い、それに応じて続行します。
この小さなヘルパーアダプターを作成して、既存のボタンを右クリック可能にし、サブクラス化する必要がないようにしました。
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
できます。
イベントフィルターやその他のものを必要とせずに、このオプションも提案したいと思います...
self.button.released.connect(self.doStuff)
self.button.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.button.customContextMenuRequested.connect(partial(self.doStuff, False))
def doStuff(self,state=True,p=QPoint()):
print("True for left, False for right!",state)