Qt 鼠标事件在 QGraphicsScene 中不起作用
Qt mouse events not working in QGraphicsScene
我正在使用 Qt 5.7(最新版本)。我无法让鼠标事件在 QGraphicsScene 中工作,但它们在我场景之外的 window 中工作。我已经关注了这个 question.
所以我在主小部件的子类中覆盖了 QWidget::mouseMoveEvent()
,如下所示:
// header:
class MyWidget {
...
void mouseMoveEvent( QMouseEvent * event );
};
// source:
MyWidget::MyWidget() {
setMouseTracking();
}
void MyWidget::mouseMoveEvent( QMouseEvent * event ) {
}
不适用于:mouseMoveEvent
、mouseGrabber
、mousePressEvent
、mouseReleaseEvent
或 mouseDoubleClickEvent
。但不知何故它只适用于 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";
}
Mouse move events will occur only when a mouse button is pressed down, unless mouse tracking has been enabled with QWidget::setMouseTracking().
因此,我认为您应该使用“bool hasMouseTracking() const”检查 mouseTracking
是否 真的 已启用。
当 Qt 生成鼠标事件时,它通常首先传递给生成事件时鼠标指针下方的 QWidget
。如果 QWidget
accepts 事件,则不会进行进一步处理。如果事件 未被 接受,则 Qt 可能会将事件传播给 QWidget
的父级,依此类推。
在您的特定情况下,您感兴趣的鼠标移动事件将被发送到接受它们的 QGraphicsView
/QGraphicsScene
组件,因此不会进行进一步处理。在这种情况下,您通常需要安装一个 event filter 来拦截和处理感兴趣的事件。
我正在使用 Qt 5.7(最新版本)。我无法让鼠标事件在 QGraphicsScene 中工作,但它们在我场景之外的 window 中工作。我已经关注了这个 question.
所以我在主小部件的子类中覆盖了 QWidget::mouseMoveEvent()
,如下所示:
// header:
class MyWidget {
...
void mouseMoveEvent( QMouseEvent * event );
};
// source:
MyWidget::MyWidget() {
setMouseTracking();
}
void MyWidget::mouseMoveEvent( QMouseEvent * event ) {
}
不适用于:mouseMoveEvent
、mouseGrabber
、mousePressEvent
、mouseReleaseEvent
或 mouseDoubleClickEvent
。但不知何故它只适用于 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";
}
Mouse move events will occur only when a mouse button is pressed down, unless mouse tracking has been enabled with QWidget::setMouseTracking().
因此,我认为您应该使用“bool hasMouseTracking() const”检查 mouseTracking
是否 真的 已启用。
当 Qt 生成鼠标事件时,它通常首先传递给生成事件时鼠标指针下方的 QWidget
。如果 QWidget
accepts 事件,则不会进行进一步处理。如果事件 未被 接受,则 Qt 可能会将事件传播给 QWidget
的父级,依此类推。
在您的特定情况下,您感兴趣的鼠标移动事件将被发送到接受它们的 QGraphicsView
/QGraphicsScene
组件,因此不会进行进一步处理。在这种情况下,您通常需要安装一个 event filter 来拦截和处理感兴趣的事件。