首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的QDeclarativeItem没有任何鼠标/键盘事件?

为什么我的QDeclarativeItem没有任何鼠标/键盘事件?
EN

Stack Overflow用户
提问于 2013-06-16 06:32:27
回答 1查看 1.1K关注 0票数 2

这是一个精简的、最小的完整示例,演示了我的问题:

我有一个承载QDeclarativeView;文件events.cpp的应用程序

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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文件很简单:

代码语言:javascript
复制
import QtQuick 1.0
import Testing 1.0

Tester {
  width: 200
  height: 200
}

它都是用qmake文件构建的(在Debian-Wheezy amd64上使用qt4.8)

代码语言:javascript
复制
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++端就没有它们的迹象了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-16 07:24:05

要获取(左)鼠标事件,只需添加

代码语言:javascript
复制
setAcceptedMouseButtons(Qt::LeftButton);

TestItem构造函数中。这有点让人惊讶,因为继承的QGraphicsItem::setAcceptedMouseButtons的文档说“默认情况下,所有的鼠标按键都是接受的”,但可能是设置中的其他东西扰乱了状态。

要获取键盘事件,只需调用setFocus(true)。文档似乎暗示也应该调用setFlag(QGraphicsItem::ItemIsFocusable,true),但在我的测试中似乎没有必要调用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17128533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档