2013-05-26 11 views
6

Ho problemi con PySide mentre provo a determinare quale pulsante del mouse viene premuto nella funzione evento. Ne ho bisogno in particolare per ignorare l'evento di spostamento del mouse, perché sta facendo un lavoro su entrambi i pulsanti del mouse, a sinistra ea destra.Qt come controllare quale tasto del mouse è premuto

Desidero ignorare l'evento di spostamento del mouse se viene premuto il pulsante destro sulla scena. Qualsiasi aiuto?

risposta

14

Tutti gli eventi del mouse ha due metodi (button e buttons) per determinare quali dei tasti vengono premuti. Ma solo per l'evento move la documentazione dice:

Si noti che il valore restituito è sempre Qt :: NoButton per gli eventi di spostamento del mouse.

per mouseMoveEvent è necessario utilizzare il metodo buttons.

void mouseMoveEvent(QMouseEvent *e) 
{ 
    if(e->buttons() == Qt::RightButton) 
     qDebug() << "Only right button"; 
} 

Al fine di ignorare gli eventi di movimento che devi fare questo lavoro in eventFilter naturalmente.

+0

Questo è quello che mi serve. Grazie mille. Vorrei aprire una nuova domanda per eventFilter se puoi aiutarmi con il filtro del mouse. – Alex

+0

@ Ax siete i benvenuti, vedrò la tua domanda su 'eventFilter' il prima possibile, ma sono in grado di fornirti solo il codice C++. – fasked

+0

Pubblicato QUI: http://stackoverflow.com/questions/16772227/qt-mouse-event-propagation-with-scene-items – Alex

1

è possibile controllare quale pulsante del mouse viene premuto tramite Qt::RightButton. Ci scusiamo per il codice C++, ma spero, si dovrebbe capire idea comunque:

void mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button()==Qt::RightButton){ 
     qDebug() << "right button is pressed 
    } 
} 
+1

Vota per il tuo impegno, ma ho già provato questo, e mentre funziona con la stampa del mouse e il rilascio del mouse, non funziona nell'evento MOUSE MOVE. – Alex

+0

Questo non funziona per me. Il widget riceve 'QContextMenuEvent' invece di' QMouseEvent', qualunque cosa io faccia - anche se non ho menu, e provare a usare 'setContextMenuPolicy' non cambia nulla. –

2

Si potrebbe utilizzare un valore booleano:

void mousePressEvent(QMouseEvent *event) 
{ 
if (event->button()==Qt::RightButton){ 
    qDebug() << "right button is pressed 
    pressed=true; //<----- 
} 
} 

e mouseMoveEvent

void GLWidget::mouseMoveEvent(QMouseEvent *event) 
{ 

float dx = event->x() - lastPos.x();  // where lastpos is a QPoint member 
float dy = event->y() - lastPos.y(); 

if (dx<0) dx=-dx; 
if (dy<0) dy=-dy; 

if (event->buttons() & Qt::LeftButton) { //if you have MOVEd 

    ...do something 

} 

if (event->buttons() & Qt::RightButton) { 

    if (pressed==true) return; 
    else{ 
    ...do 
    } 
} 
} 

Su mouseRelease si deve set premuto = falso; ("Premuto" deve essere un membro della classe)

Speranza che aiuta, me lo faccia sapere

+0

+1 per provare, ma non è quello che mi serve. Non metterei booleano per quella questione, troppo rischioso quando l'utente è goffo con il mouse ... ho notato che Qt non è il massimo con l'elaborazione degli eventi del mouse. Sono certo che esiste un metodo integrato per questo scopo. – Alex

+0

Questo non sembra funzionare correttamente, sembrava solo prendere il pulsante del mouse se l'istruzione diceva: 'if (event-> buttons() == Qt :: LeftButton)' per esempio, piuttosto che 'button()' . –

6

QApplication::mouseButtons() restituirà lo stato di mouseButton, così, è possibile ottenere lo stato del mouse in KeyPressEvent.

Problemi correlati