【问题标题】:MouseMoveEvent not trigger when button is disabled禁用按钮时不会触发 MouseMoveEvent
【发布时间】:2021-01-26 15:35:24
【问题描述】:

QPushButton被禁用时如何强制mouseMoveEvent?

我在 QScrollArea 上禁用了 QPushButton,并且在滑动时 mouseMoveEvent 没有被触发。

【问题讨论】:

    标签: qt qt5 mousemove disabled-control


    【解决方案1】:

    你可以像这样使用eventFilter

    主窗口.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
        bool eventFilter(QObject *obj, QEvent *event) override;
    };
    #endif // MAINWINDOW_H
    

    主窗口.cpp

    #include "mainwindow.h"
    
    #include <QMouseEvent>
    #include <QHBoxLayout>
    #include <QDebug>
    #include <QPushButton>
    
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        QPushButton *button = new QPushButton{this};
        button->installEventFilter(this);
        button->setMouseTracking(true);
        button->setText("bla");
        button->setDisabled(true);
    
        QWidget *widget = new QWidget{this};
        QHBoxLayout *layout = new QHBoxLayout{widget};
        layout->setContentsMargins(50, 50, 50, 50);
        layout->addWidget(button);
        this->setCentralWidget(widget);
    }
    
    MainWindow::~MainWindow()
    {
    }
    
    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
        if (event->type() == QEvent::MouseMove)
        {
            qDebug() << "mouse move" << static_cast<QMouseEvent*>(event)->pos();
            return true;
        }
        else
            return QMainWindow::eventFilter(obj, event);
    }
    

    【讨论】:

    • 它几乎可以工作。鼠标位置返回奇怪。例如,当我垂直向下移动时,我得到的值有时会变小,有时会变大。 QPoint(225,343) QPoint(227,335) QPoint(226,356) QPoint(227,348) QPoint(226,369) QPoint(224,361) QPoint(226,374) QPoint(229,355) QPoint(232,368) QPoint(233,352) ?
    • 你是怎么得到这个职位的? qDebug() &lt;&lt; "mouse move" &lt;&lt; static_cast&lt;QMouseEvent*&gt;(event)-&gt;pos(); 为我工作。
    • 我的完全一样。返回值对 mouseMoveEvent() 和 event() 有效。
    • 那么也许考虑分享你的代码。我的小例子没有这种行为。
    • 当我移动我的手指时,我改变了滚动条的值,然后它很奇怪地返回了位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2013-04-29
    • 2012-03-16
    相关资源
    最近更新 更多