为啥我的 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();
TestItem
是QDeclarativeItem
文件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 绘图