2016-08-30 7 views
0

Ich möchte alle Funktionen der linken Maustaste (wie geklickt(), gedrückt(), freigegeben(), setAutoRepeat()) auf QPushButton von der rechten Maustaste alle halten Die Funktionalität der linken Schaltfläche ist intakt. Hier ist der Code für die erneute Implementierung des eventFilter, der kein wünschenswertes Ergebnis liefert.Rechte Maustaste Funktionalität in QPushButton

bool PreciseControl::eventFilter(QObject *, QEvent *event) 
{ 
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); 


if(event->type() == QEvent::MouseButtonPress && 
        mouseEvent->button()==Qt::RightButton) 
{ 


     emit rightMousePressed(); 
     return true; 
} 
else if(event->type() == QEvent::MouseButtonRelease && 
     mouseEvent->button()==Qt::RightButton) 
{ 
     emit rightMouseReleased(); 
     return true; 
} 


if(event->type() == QEvent::MouseButtonPress && 
        mouseEvent->button()==Qt::LeftButton) 
{ 


     emit leftMousePressed(); 
     return true; 
} 
else if(event->type() == QEvent::MouseButtonRelease && 
     mouseEvent->button()==Qt::LeftButton) 
{ 
     emit leftMouseReleased(); 
     return true; 
} 

return false;} 

Kann jemand helfen? Danke im Voraus.

+1

Blick in http://stackoverflow.com/questions/15658464/qt-rightclick-qpushbutton. – MoraRockey

+0

Wie in Ihrem Beispiel überprüfen Sie [link] (http://doc.qt.io/qt-4.8/qobject.html#eventFilter) für Event filter, hier wird angegeben, dass wir Event-Filter für Objekt installieren müssen. In Ihrem Fall Drucktastenobjektname. Ansonsten können Sie Laufwerksklasse von QPushbutton erstellen und Ihr eigenes MouseEvent von QPushbotton schreiben –

+0

Bitte zeigen Sie ein [mcve] und erklären Sie genau, was nicht funktioniert, "gibt kein wünschenswertes Ergebnis" ist nicht spezifisch genug. – Mailerdaimon

Antwort

2

Sie sollten keine Ereignisfilter dafür verwenden. Unterklasse QPushButton und implementieren Sie Ihre eigene Rechtsklick-Behandlung. Hier ist ein funktionierendes Beispiel (Ich habe es nicht gründlich testen, so könnte es einige Probleme):

#include <QApplication> 
#include <QPushButton> 
#include <QMouseEvent> 
#include <QLayout> 
#include <QDebug> 

class CustomButton : public QPushButton 
{ 
    Q_OBJECT 
public: 
    explicit CustomButton(QWidget *parent = 0) : QPushButton(parent){} 

protected: 
    void mousePressEvent(QMouseEvent *e) 
    { 
     if(e->button() == Qt::RightButton && hitButton(e->pos())) 
     { 
      setDown(true); 
      emit pressed(); 
     } 
     QPushButton::mousePressEvent(e); 
    } 

    void mouseMoveEvent(QMouseEvent *e) 
    { 
     if(e->buttons() & Qt::RightButton) 
     { 
      if(hitButton(e->pos()) != isDown()) 
       setDown(!isDown()); 
     } 
     QPushButton::mouseMoveEvent(e); 
    } 

    void mouseReleaseEvent(QMouseEvent *e) 
    { 
     if(e->button() == Qt::RightButton) 
     { 
      setDown(false); 
      if(hitButton(e->pos())) 
       click(); 
     } 
     QPushButton::mouseReleaseEvent(e); 
    } 
}; 

void buttonClicked() 
{ 
    qDebug() << "CLICKED"; 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QWidget w; 
    w.resize(500,500); 
    w.setLayout(new QVBoxLayout); 
    CustomButton button; 
    button.setAutoRepeat(true); 
    QObject::connect(&button, &CustomButton::clicked, &buttonClicked); 
    w.layout()->addWidget(&button); 
    w.show(); 

    return a.exec(); 
} 

#include "main.moc" 

Wenn Sie zwischen der rechten Maustaste und klicken Sie links unterscheiden wollen, dann finden Sie in die source code for QAbstractButton::click, und implementieren Sie Ihre eigenen für den Rechtsklick.

+0

Tatsächlich ist die Verwendung eines Ereignisfilters ein idiomatischer Ansatz, um einem 'QWidget' ein Verhalten hinzuzufügen :) –

+0

Danke. Es hat mein Problem bis zu einem gewissen Grad gelöst. Aber ich muss noch AutoRpeat-Funktion von der rechten Taste drücken Ereignis. Können Sie bitte so freundlich sein, mir zu zeigen, wie das geht? Danke im Voraus. – rugi

+0

@KubaOber Sicher. Ich finde nur diesen Weg schöner zu sein :) – thuga

0

Sie können die Funktionalität in einem Ereignisfilter implementieren und auf den Schaltflächen installieren, auf die Sie mit der rechten Maustaste klicken können.

// https://github.com/KubaO/stackoverflown/tree/master/questions/right-to-left-event-39220180 
#include <QtWidgets> 

class RightToLeftClick : public QObject { 
    bool eventFilter(QObject *watched, QEvent *event) { 
     if (event->type() == QEvent::MouseButtonDblClick || 
       event->type() == QEvent::MouseButtonPress || 
       event->type() == QEvent::MouseButtonRelease) { 
      auto ev = static_cast<QMouseEvent*>(event); 
      if (ev->button() == Qt::RightButton) { 
       auto buttons = ev->buttons(); 
       if (buttons & Qt::RightButton) { 
        buttons ^= Qt::RightButton; 
        buttons |= Qt::LeftButton; 
       } 
       QMouseEvent lev{ev->type(), 
          ev->localPos(), 
          ev->windowPos(), 
          ev->screenPos(), 
          Qt::LeftButton, 
          buttons, 
          ev->modifiers(), 
          ev->source()}; 
       Q_ASSERT(! (lev.buttons() & Qt::RightButton)); 
       QCoreApplication::sendEvent(watched, &lev); 
       return true; 
      } 
     } 
     return QObject::eventFilter(watched, event); 
    } 
public: 
    explicit RightToLeftClick(QObject * parent = nullptr) : QObject{parent} { 
     addTo(parent); 
    } 
    void addTo(QObject * obj) { 
     if (obj) obj->installEventFilter(this); 
    } 
}; 

Hier ist, wie es zu benutzen:

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QWidget ui; 
    QVBoxLayout layout{&ui}; 
    QPushButton button1{"Left Click Me"}; 
    QPushButton button2{"Right Click Me"}; 
    layout.addWidget(&button1); 
    layout.addWidget(&button2); 
    ui.show(); 
    RightToLeftClick rtl{&button2}; 
    return app.exec(); 
} 
+0

Danke. Aber ich muss noch AutoRpeat-Funktion von der rechten Taste drücken Ereignis. Können Sie bitte so freundlich sein, mir zu zeigen, wie das geht? Danke im Voraus. – rugi

+0

Ich denke, Sie haben diesen Code dann nicht ausprobiert. Die Autorepeat funktioniert gut unter Qt 5.7. Natürlich müssen Sie 'AutoRepeat' auf dem Button setzen! –

Verwandte Themen