为啥我的 QDeclarativeItem 没有得到任何鼠标/键盘事件?

Posted

技术标签:

【中文标题】为啥我的 QDeclarativeItem 没有得到任何鼠标/键盘事件?【英文标题】:Why doesn't my QDeclarativeItem get any mouse/keyboard events?为什么我的 QDeclarativeItem 没有得到任何鼠标/键盘事件? 【发布时间】:2013-06-15 22:32:26 【问题描述】:

这是一个简化的、最小的完整示例,展示了我的问题:

我有一个托管QDeclarativeView 的应用程序;文件events.cpp:

#include <QApplication>
#include <QDeclarativeView>
#include "TestItem.h"

int main(int argc,char* argv[]) 
  QApplication app(argc,argv);

  qmlRegisterType<TestItem>("Testing",1,0,"Tester");

  QDeclarativeView page;
  page.setSource(QUrl("page.qml"));
  Q_ASSERT(page.status()==QDeclarativeView::Ready);
  page.show();
  return app.exec();

TestItemQDeclarativeItem 文件TestItem.h 中定义的子类:

#ifndef _TestItem_h_
#define _TestItem_h_

#include <iostream>
#include <QDeclarativeItem>
#include <QPainter>

class TestItem : public QDeclarativeItem 
  Q_OBJECT
public:
  TestItem() 
    setFlag(QGraphicsItem::ItemHasNoContents,false);
    std::cerr << "[TestItem created]";
  
  void paint(QPainter* painter,const QStyleOptionGraphicsItem*,QWidget*) 
    painter->drawLine(0,0,width(),height());
    painter->drawLine(0,height(),width(),0);
  
protected:
  void mousePressEvent(QGraphicsSceneMouseEvent*) 
    std::cerr << "[TestItem::mousePressEvent]";
  
  void keyPressEvent(QKeyEvent*) 
    std::cerr << "[TestItem::keyPressEvent]";
  
;

#endif

而加载到QDeclarativeView 中的page.qml 文件很简单:

import QtQuick 1.0
import Testing 1.0

Tester 
  width: 200
  height: 200

全部使用 qmake 文件构建(在 Debian-Wheezy amd64 上使用 Qt 4.8)

CONFIG += debug

QT += core gui declarative

TARGET = events
TEMPLATE = app

SOURCES += events.cpp 
HEADERS += TestItem.h

一旦构建完成,当我运行 ./events 时,我会得到一个窗口,显示测试人员绘制的“X”,正如预期的那样:

[TestItem created] 登录到控制台。但是,在窗口内单击或按键完全无法调用鼠标或按键事件处理程序。

我完全被迷惑了。是否需要一些额外的魔法(在 C++ 或 QML 域中)才能将鼠标/键盘事件路由到这些“插件”QDeclarativeItem 类?我当然没有任何问题在 QML 文件中定义 MouseArea 并让它对 QML 状态进行处理,并且减少的代码在 C++ 项和 QML 代码之间的信号和插槽互操作方面没有问题。 . 但是当涉及到鼠标/键盘事件时,在 C++ 端没有任何迹象。

【问题讨论】:

可能与***.com/questions/13321902/…有某种联系 【参考方案1】:

要获取(左)鼠标事件,只需添加

setAcceptedMouseButtons(Qt::LeftButton);

TestItem 构造函数中。这有点令人惊讶,因为继承的 QGraphicsItem::setAcceptedMouseButtons 的文档说“默认情况下,所有鼠标按钮都被接受”,但可能设置中的其他东西会与状态混淆。

要获取键盘事件,只需调用setFocus(true)。该文档似乎暗示也应该调用setFlag(QGraphicsItem::ItemIsFocusable,true),但在我的测试中它实际上似乎没有必要。

【讨论】:

以上是关于为啥我的 QDeclarativeItem 没有得到任何鼠标/键盘事件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 将图像渲染到子类 QDeclarativeItem

QDeclarativeItem 中的 OpenGL 绘图搞乱了其他 QML 绘图

为啥我的查询不会在我的代码中执行,而它在普通 sql 中执行得很好?

为啥我的 Laravel 模型关系没有保存?

为啥我的单引号 (') 没有被编码?

为啥我的验证消息没有显示?