在QQuickItem上处理鼠标事件

7
我创建了一个基本的QML应用程序,使用QQuickView创建视图,并在其中使用自定义的QQuickItems。我想通过重新实现mousepressevent(QEvent *)方法来处理其中一个QQuickItem上的鼠标事件。然而,当我运行应用程序并单击QQuickItem时,没有调用mousepressevent(QEvent *)方法。
QQuickItem的头文件如下所示:
#include <QQuickItem>
#include <QSGGeometry>
#include <QSGFlatColorMaterial>

class TriangularGeometry: public QQuickItem
{
         Q_OBJECT
         public:
              TriangularGeometry(QQuickItem* parent = 0);
              QSGNode* updatePaintNode(QSGNode*, UpdatePaintNodeData*);
              void mousePressEvent(QMouseEvent *event);

         private:
              QSGGeometry m_geometry;
              QSGFlatColorMaterial m_material;
              QColor m_color;
}; 

注意:我正在使用场景图来渲染QuickItem。
这是cpp文件中的一段代码片段:
void TriangularGeometry::mousePressEvent(QMouseEvent *event)
{
    m_color = Qt::black;
    update(); //changing an attribute of the qquickitem and updating the scenegraph
}

我可以从应用程序中处理鼠标事件,但根据我的要求,我需要通过重写方法 mousePressEvent(QMouseEvent *event) 来处理它。


找到解决方案了。首先必须在构造函数中调用setAcceptedMouseButtons(Qt::AllButtons)。任何对QuickItem的点击都会将鼠标事件处理路由到mousePressEvent(QMouseEvent *)函数。 - Sarin
我不确定直接在项目中使用鼠标是一个好主意,你可以使用MouseArea来实现。"单一职责原则":做一件事情,但要做好。 - gbdivers
1个回答

17

确保在处理事件之前调用此方法(构造函数是一个很好的位置):

setAcceptedMouseButtons(Qt::AllButtons);

按键枚举当然可以是任何你想要的。


这对于 mousePressEvent 对我有效,但是对于只在 mouseDoubleClickEvent 之后触发的 mouseReleaseEvent 却无效。这只是我的问题吗? - AkiRoss
仅适用于试图解决此问题的用户。不要调用基本方法mousePressEvent和其他方法。这是因为QQuickItem调用ignore事件,这就是为什么您无法处理Release事件的原因。 - lolopolosko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接