2

これは、私の問題を示す縮小された、最小限の完全な例です。

をホストするアプリケーションがあります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たサブクラスです:QDeclarativeItemTestItem.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++ 側にそれらの兆候はありません。

4

1 に答える 1