Qt:即使按下了按钮,也能获得鼠标按下的事件

问题描述:

我需要简单地检测每次在我的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。 问题是,如果点击发生在按钮上,我不会收到该事件。

您必须从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

所以我不能只有一个管理鼠标按钮的处理程序? Wheter如果我点击标签,按钮或任何地方? –

+0

是的,你可以。使用事件过滤机制。我已将它添加到我的答案中。 – Hariprasad