2013-12-21 5 views
2

Мне нужно просто определить, когда нажимать или отпускать правую кнопку в моем приложении Qt5/C++ каждый момент.Qt: получать нажатие на кнопку мыши, даже если нажата кнопка.

До сих пор я кодированные эти функции:

void test::mousePressEvent(QMouseEvent *ev){ 
    if(ev->buttons() == Qt::LeftButton){ 
     qDebug() << "Left pressed"; 
     ui->forceBar->setValue(100); 
    } 

} 

void test::mouseReleaseEvent(QMouseEvent *ev){ 
    if(ev->button() == Qt::LeftButton){ 
     ui->forceBar->setValue(50); 
     qDebug() << "Left released"; 
    } 

Они прекрасно работают, только если щелчок не на pushbuttontest. Проблема в том, что если щелчок происходит на кнопке, я не получаю событие.

ответ

2

Вы должны опираться на QPushButton и переопределять эти обработчики событий.

class MyButton : public QPushButton 
{ 
    protected: 
     virtual void mousePressEvent(QMouseEvent* event); 
     virtual void mouseReleaseEvent(QMouseEvent* event); 
}; 


void MyButton::mousePressEvent(QMouseEvent *ev){ 
    if(ev->buttons() == Qt::LeftButton){ 
     qDebug() << "Left pressed"; 
     ui->forceBar->setValue(100); 
    } 

} 

void MyButton::mouseReleaseEvent(QMouseEvent *ev){ 
    if(ev->button() == Qt::LeftButton){ 
     ui->forceBar->setValue(50); 
     qDebug() << "Left released"; 
    } 

Затем используйте эту кнопку, как pushbuttontest:

QPushButton* pushbuttontest = new MyButton(); 

Или, если вы хотите иметь общий обработчик событий для многих виджетов, вы можете использовать фильтры событий:

class test : public QWidget // the widget in which you want to capture all events 
{ 
public: 
    bool eventFilter(QObject *watched, QEvent *e); 
private: 
    QPushButton* pushbuttontest; 
    QLabel *myLabel; 
}; 

bool test::eventFilter(QObject *watched, QEvent *e) 
{ 
    if (e->type() == QEvent::MouseButtonPress)) 
    {  
     QMouseEvent* ev = (QMouseEvent*)e; 
     if(ev->buttons() == Qt::LeftButton){ 
     qDebug() << "Left pressed"; 
     ui->forceBar->setValue(100); 
    } 
    } 
else if (e->type() == QEvent::MouseButtonRelease) 
    { 
     QMouseEvent* ev = (QMouseEvent*)e; 
     if(ev->buttons() == Qt::LeftButton){ 
     qDebug() << "Left released"; 
     ui->forceBar->setValue(100); 
    } 
    } 
    return false;// return true if you are finished handling the event. So, the default event handler will not be called. 
} 

Затем установите eventFilter в нужные виджеты:

pushbuttontest = new QPushButton(); 
pushbuttontest->instalEventFilter(this); // this is the test class object which has our event filter code. 
myLabel = new QLabel(); 
myLabel->installEventFilter(this); 

и т. Д.

Обратите внимание, что я не скомпилировал этот код. Это может не сработать сразу.

Для получения дополнительной информации: http://qt-project.org/doc/qt-4.8/eventsandfilters.html

+1

Так что я не могу иметь только один обработчик, который управлять кнопкой мыши? Если я нажму на ярлык, на кнопку или где-нибудь? –

+0

Да, вы можете. Использование механизма фильтра событий. Я добавил его к своему ответу. – Hariprasad

Смежные вопросы