【问题标题】:Qt: get mouse pressed event even if a button is pressedQt:即使按下按钮也能获得鼠标按下事件
【发布时间】:2013-12-21 19:39:13
【问题描述】:

我需要简单地检测我的 Qt5/C++ 应用程序中何时按下或释放右键。

到目前为止,我已经编写了这些函数:

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 上时,它们才能正常工作。 问题是如果点击发生在按钮上,我不会得到事件。

【问题讨论】:

    标签: c++ events event-handling mouseevent qt5


    【解决方案1】:

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

    【讨论】:

    • 所以我不能只有一个处理程序来管理鼠标按钮?如果我点击标签、按钮或任何地方?
    • 是的,你可以。使用事件过滤机制。我已将其添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多