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.
- 1. Qt QPushbutton Ikona powyżej tekstu
- 2. Qt RightClick na QListWidget Otwiera menu kontekstowe i Usuń pozycję
- 3. QT QPushButton z ikoną i warstwą wyśrodkowanego tekstu
- 4. Menu kontekstowe prawego przycisku myszy na QPushButton
- 5. Zmniejsz szerokość QPushButton do minimum
- 6. Przeciąganie/przenoszenie QPushButton w PyQt
- 7. Jak zmienić ikonę QPushButton za pomocą arkuszy stylów w aplikacji Qt
- 8. Dodaj QPushButton w QTableWidgetItem w QTableWidget, jak zrobić to QT :: AlignHCenter
- 9. Obrót obrazu w Qt
- 10. Korzystanie Hover i przycisnął stylów Qt
- 11. Qt niezdefiniowane odniesienie do vtable
- 12. porównanie między QAbstractButton i QPushButton * brakuje obsady
- 13. Jak zmienić tekst i kolor tła QPushButton
- 14. Wykrywanie wejścia na QLineEdit lub QPushButton
- 15. Co jest dla rodziców w Qt?
- 16. Qt: Nie można ustawić układu w QMainWindow
- 17. Nierozwiązane symbole zewnętrzne - Qt Creator
- 18. Qt - emitujące gniazda zamiast sygnałów
- 19. Używanie zmiennych w qt StyleSheets
- 20. Qt Łapanie sygnału z pola wyboru do wykonania czynności
- 21. Qt - (? Powolne repaint) Przeprowadzka Frameless okno
- 22. Automatyczne określanie opcji arkuszy stylów Qt?
- 23. Dlaczego Qt potrzebuje alokacji obiektów podrzędnych w sterty?
- 24. Jak zintegrować QWidget w QML (Qt Quick 2.0)
- 25. Jak dodać przyciski do głównego okna w Qt?
- 26. QPushButton() powinien reagować tak długo, jak długo jest wciśnięty
- 27. Jak emitować sygnał z QPushButton, gdy mysz na nim wisi?
- 28. Jak ustawić animowaną ikonę na QPushButton w Qt5?
- 29. W jaki sposób Qt rysuje swoje komponenty GUI (podstawowa idea)?
- 30. Jak ustawić kolor tła dla całego okna aplikacji Qt?
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