Это уменьшенный, минимальный полный пример, демонстрирующий мою проблему:Почему мой QDeclarativeItem не получает какие-либо события мыши/клавиатуры?
У меня есть приложение, в котором есть 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
и файл page.qml
загружен в QDeclarativeView
просто:
import QtQuick 1.0
import Testing 1.0
Tester {
width: 200
height: 200
}
Все это построено (с Qt 4.8 на Debian-Wheezy amd64) с файлом qmake
CONFIG += debug
QT += core gui declarative
TARGET = events
TEMPLATE = app
SOURCES += events.cpp
HEADERS += TestItem.h
и после того, как построили, когда я бегу ./events
я получаю окно, отображающее окрашенную «X» тестера, как и ожидалось:
и [TestItem created]
вошли в консоль. Однако щелчок в окне или нажатие клавиш полностью не может вызвать какой-либо из обработчиков событий мыши или ключа.
Я полностью озадачен. Является ли какая-то дополнительная магия (в доменах C++ или QML) необходимой для того, чтобы события мыши/клавиатуры были перенаправлены на такие классы «плагин» QDeclarativeItem
? У меня, конечно же, нет проблем с определением MouseArea
в QML-файле и его заполнением до состояния QML, а код, от которого это сокращено, не имеет проблем с сигналами и слотами, взаимодействующими между C++-элементом и QML-кодом ... но когда дело доходит до событий мыши/клавиатуры, на стороне C++ их нет.
Возможно, какая-то связь с http://stackoverflow.com/questions/13321902/event-providing-to-qwidgetqwt-embedded-into-qml-qt4 – timday