【问题标题】:Qt mouse events not working in QGraphicsSceneQt 鼠标事件在 QGraphicsScene 中不起作用
【发布时间】:2016-08-21 22:27:14
【问题描述】:

我使用的是 Qt 5.7(最新版本)。我无法让鼠标事件在 QGraphicsScene 中工作,但它们在我的场景之外的窗口中工作。我关注了这个question.

所以我在我的主小部件的子类中覆盖了QWidget::mouseMoveEvent(),如下所示:

// header:
class MyWidget {
    ...
    void mouseMoveEvent( QMouseEvent * event );
};

// source:
MyWidget::MyWidget() {
    setMouseTracking();
}

void MyWidget::mouseMoveEvent( QMouseEvent * event ) {

}

它不适用于:mouseMoveEventmouseGrabbermousePressEventmouseReleaseEventmouseDoubleClickEvent。但不知何故,它只适用于mousePressEvent

这可能是 Qt 中的错误吗?

源代码: 在objectloader.cpp中

ObjectLoader::ObjectLoader(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ObjectLoader)
{
  ui->setupUi(this);
   scene=new QGraphicsScene(this);
   ui->graphicsView->setScene(scene);
   ui->graphicsView->setMouseTracking(true);
  setMouseTracking(true);



}

那是我设置了两次鼠标跟踪 在 objectloader.h 然后我在 objectloader.h 中定义该方法

class ObjectLoader : public QMainWindow
{
    Q_OBJECT


    public:
        explicit ObjectLoader(QWidget *parent = 0);
        ~ObjectLoader();

    private slots:
    void mouseMoveEvent(QMouseEvent *event);
    protected:

    private:

    };

    #endif // OBJECTLOADER_H

该方法在 objectloader.cpp 中的实现

void ObjectLoader::mouseMoveEvent(QMouseEvent *event){

    qDebug()<<"Mouse moved";

}

【问题讨论】:

    标签: c++ qt user-interface mouse mousemove


    【解决方案1】:

    当 Qt 生成鼠标事件时,它通常最初传递给事件生成时鼠标指针下方的QWidget。如果QWidgetaccepts 事件发生,则不会进行进一步处理。如果事件没有被接受,那么 Qt 可能会将事件传播给 QWidget 的父级,依此类推。

    在您的特定情况下,您感兴趣的鼠标移动事件被发送到QGraphicsView/QGraphicsScene 组件,在那里它们被接受,因此不会进行进一步的处理。在这种情况下,您通常需要安装一个event filter 来拦截和处理感兴趣的事件。

    【讨论】:

      【解决方案2】:

      只有在按下鼠标按钮时才会发生鼠标移动事件,除非使用 QWidget::setMouseTracking() 启用了鼠标跟踪。

      所以,我认为你应该使用`bool hasMouseTracking() const'来检查mouseTracking是否真的启用。

      【讨论】:

      • 我确定它已启用。当我运行此代码时 if(hasMouseTracking()){qDebug()
      • 你能发布你的出处吗?
      • 更新鼠标事件在 QtGraphicsView 上不起作用,但在窗口的任何其他部分起作用?
      • QMainWindow 有一个centralWidget()。您也应该为centralWidget 调用setMouseTracking()。所以,在你的ObjectLoader ctor 中,centralWidget()-&gt;setMouseTracking(true)
      • 发现 QGraphicsScene 不接受 MouseEvents 但 QGraphicsSceneMouseEvents,实现该方法没有帮助。不知何故,我的 GraphicsScene 是窗口中的黑点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2011-02-02
      • 2015-06-23
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多