2013-06-15 1 views
2

Это уменьшенный, минимальный полный пример, демонстрирующий мою проблему:Почему мой 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» тестера, как и ожидалось:

enter image description here

и [TestItem created] вошли в консоль. Однако щелчок в окне или нажатие клавиш полностью не может вызвать какой-либо из обработчиков событий мыши или ключа.

Я полностью озадачен. Является ли какая-то дополнительная магия (в доменах C++ или QML) необходимой для того, чтобы события мыши/клавиатуры были перенаправлены на такие классы «плагин» QDeclarativeItem? У меня, конечно же, нет проблем с определением MouseArea в QML-файле и его заполнением до состояния QML, а код, от которого это сокращено, не имеет проблем с сигналами и слотами, взаимодействующими между C++-элементом и QML-кодом ... но когда дело доходит до событий мыши/клавиатуры, на стороне C++ их нет.

+0

Возможно, какая-то связь с http://stackoverflow.com/questions/13321902/event-providing-to-qwidgetqwt-embedded-into-qml-qt4 – timday

ответ

2

Чтобы получить (слева) события мыши, все, что необходимо, чтобы добавить

setAcceptedMouseButtons(Qt::LeftButton); 

в TestItem конструктора. Это немного удивительно, поскольку документация для унаследованного QGraphicsItem::setAcceptedMouseButtons гласит: «По умолчанию все кнопки мыши приняты», но, возможно, что-то еще в настройках беспорядков с состоянием.

Чтобы получить события клавиатуры, необходимо вызвать setFocus(true). Документация, похоже, подразумевает, что setFlag(QGraphicsItem::ItemIsFocusable,true) также должен быть вызван, но на самом деле это не кажется необходимым в моем тесте.