Sto usando Qt Creator per creare una GUI per un gioco mineseparto. Come posso sapere che un QpushButton ha fatto clic con rightclick? per la bandiera nel gioco. In altre parole, quale segnale viene usato per rightclick?Qt rightclick QPushButton
risposta
Crea il tuo pulsante con filtro a mouseStampo PressEvent.
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();
}
Ora collegare in questo modo
QRightClickButton *button = new QRightClickButton(this);
ui->gridLayout->addWidget(button);
connect(button, SIGNAL(rightClicked()), this, SLOT(onRightClicked()));
Creare uno slot in mainwindow.cpp.
void MainWindow::onRightClicked()
{
qDebug() << "User right clicked me";
}
Funziona per me!
Se qualcuno desidera connettersi() sia al segnale generico cliccato() che al segnale personalizzato rightClicked() - è necessario chiamare 'QPushButton :: mousePressEvent (e);' alla fine di overridden 'mousePressEvent (QMouseEvent * e) ' – Krzysiek
Penso che QPushButton sia implementato internamente per ascoltare solo i clic del mouse sinistro. Ma puoi facilmente estendere QPushButton e ri-implementare diciamo l'evento di rilascio del mouse e fare la tua cosa se il pulsante destro del mouse è stato premuto, ad es. emettere un segnale rightClicked()
personalizzato per esempio:
signals:
void rightClicked();
protected:
void mouseReleaseEvent(QMouseEvent *e) {
if (e->button() == Qt::RightButton) emit rightClicked();
else if (e->button() == Qt::LeftButton) emit clicked();
}
... oppure è possibile creare un sovraccarico del segnale cliccato che inoltra il puntatore mouseEvent modo da poter fare lo stesso controllo al di fuori del pulsante.
signals:
void clicked(QMouseEvent *);
protected:
void mouseReleaseEvent(QMouseEvent *e) {
emit clicked(e);
}
Poi si fa il check-in slot di collegare il segnale del tasto clicked(QMouseEvent *)
per e procedere di conseguenza.
Sto usando 'QPushButton' e non ci sono' button() 'in questo. cosa dovrei fare? – KhoC
@ KhoC Cosa ?? 'button()' è un metodo di 'QMouseEvent'. – cmannett85
quindi non so come posso usare 'mouseReleaseEvent'. perché chiami 'rightClicked()' in 'mouseReleaseEvent'? – KhoC
Ho appena scritto questo adattatore piccolo aiutante per fare qualsiasi pulsante esistente destro cliccabile senza la necessità di creare una sottoclasse esso:
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;
};
Usage:
connect(ui->pushButton, &QPushButton::clicked, [](){qDebug() << "Button clicked";});
new CRightClickEnabler(ui->pushButton);
Da ora in poi, il segnale clicked
sarà essere attivato dal clic destro e sinistro del mouse. Non è necessario eliminare questo oggetto: utilizza ui->pushButton
come genitore e verrà eliminato automaticamente da Qt quando il genitore viene distrutto.
Ovviamente, è possibile scrivere 2 righe di codice (letteralmente) per dichiarare un nuovo segnale qui ed emettere quel segnale con il tasto destro invece di clicked
, se lo si desidera.
- 1. Tasto destro contextMenu su QPushButton
- 2. rightclick evento in Qt per aprire un menu di scelta rapida
- 3. Qt RightClick on QListWidget Apre il menu contestuale e elimina l'elemento
- 4. Gestione della memoria Qt per oggetti Qt
- 5. Ascolta rightclick su elemento svg con Raphael.js
- 6. Come impostare l'immagine su QPushButton?
- 7. Aggiungi un QPushButton in un QTableWidgetItem in un QTableWidget, Come rendere QT :: AlignHCenter
- 8. Come fare clic su un QPushButton al livello di programmazione
- 9. Eclipse integra con qt
- 10. Ruota immagine in Qt
- 11. QPushButton() dovrebbe reagire fintanto che viene premuto
- 12. Impostazione dell'immagine di sfondo per QPushButton
- 13. Rilevamento di immissione su QLineEdit o QPushButton
- 14. Riduci al minimo la larghezza di QPushButton
- 15. Trascinamento/spostamento di un QPushButton in PyQt
- 16. Impostare QLineEdit focus su Qt
- 17. C++ Segnale Qt e slot non attivo
- 18. Qt: impossibile impostare il layout in QMainWindow
- 19. JTree comportamento di rightclick come in qualsiasi Filebrowser
- 20. irrisolte simboli esterni - creatore Qt
- 21. Qt: Come aggiungere due widget (ad esempio QPushButton) alla barra di stato, uno a sinistra e l'altro a destra?
- 22. Qt QPulsante del pulsante sopra il testo
- 23. Qt riferimento non definito a vtable
- 24. Qt - emettono slot anziché segnali
- 25. Qt Segnale Catching della casella di controllo per eseguire un'azione
- 26. Utilizzando Hover e foglio di stile pressato Qt
- 27. Qt - (? Lenta repaint) Moving finestra senza telaio
- 28. Qt: creazione di un "tasto immagine svg"
- 29. Come modificare l'icona/spaziatura del testo di QPushButton con i fogli di stile?
- 30. confronto tra QAbstractButton e QPushButton * manca un cast
Probabilmente avrete bisogno di sovrascrivere 'event()' ed emettere il segnale da soli. – rainer
Perché qualcuno -1 questa domanda ?? Sì, ci sarebbero stati più sforzi, ma la domanda è buona. Grazie a Muhammad per una buona risposta. – zeFree