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
Odpowiedz
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!
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
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.
Używam 'QPushButton' i nie ma w tym przycisku' button() '. co powinienem zrobić? – KhoC
@KhoC Co? 'button()' jest metodą 'QMouseEvent'. – cmannett85
, więc nie wiem, jak mogę użyć 'mouseReleaseEvent'. dlaczego nazywacie 'rightClicked()' w 'mouseReleaseEvent'? – KhoC
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.
Prawdopodobnie będziesz musiał przesłonić 'event()' i samemu wysłać sygnał. – rainer
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