これは、私の問題を示す縮小された、最小限の完全な例です。
をホストするアプリケーションがあります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();
}
それはfile で定義され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
}
それはすべて(Debian-Wheezy amd64上のQt 4.8で)qmakeファイルで構築されています
CONFIG += debug
QT += core gui declarative
TARGET = events
TEMPLATE = app
SOURCES += events.cpp
HEADERS += TestItem.h
そして、ビルドしたら、実行する./events
と、予想どおり、テスターのペイントされた「X」を表示するウィンドウが表示されます。
および[TestItem created]
コンソールに記録されます。ただし、ウィンドウ内をクリックしたり、キーを押したりしても、マウスまたはキー イベント ハンドラーの呼び出しに完全に失敗します。
私は完全に当惑しています。これらの種類の「プラグイン」QDeclarativeItem
クラスにルーティングされるマウス/キーボードイベントを取得するために、(C++ または QML ドメインで) 追加の魔法が必要ですか? 私は確かMouseArea
に、QML ファイルで a を定義し、それを QML 状態に処理させることに問題はありません。また、これが縮小されたコードには、C++ アイテムと QML コードの間で相互運用するシグナルとスロットに問題はありません... しかし、マウス/キーボード イベントに関しては、C++ 側にそれらの兆候はありません。