这是一个精简的、最小的完整示例,演示了我的问题:
我有一个承载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是在文件TestItem.h中定义的子类QDeclarativeItem
#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上使用qt4.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++端就没有它们的迹象了。
发布于 2013-06-16 07:24:05
要获取(左)鼠标事件,只需添加
setAcceptedMouseButtons(Qt::LeftButton);在TestItem构造函数中。这有点让人惊讶,因为继承的QGraphicsItem::setAcceptedMouseButtons的文档说“默认情况下,所有的鼠标按键都是接受的”,但可能是设置中的其他东西扰乱了状态。
要获取键盘事件,只需调用setFocus(true)。文档似乎暗示也应该调用setFlag(QGraphicsItem::ItemIsFocusable,true),但在我的测试中似乎没有必要调用它。
https://stackoverflow.com/questions/17128533
复制相似问题