gpt4 book ai didi

c++ - 为什么我的 QDeclarativeItem 没有收到任何鼠标/键盘事件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:12 25 4
gpt4 key购买 nike

这是一个简化的、最小的完整示例,用于演示我的问题:

我有一个托管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

加载到QDeclarativeView 中的page.qml 文件很简单:

import QtQuick 1.0
import Testing 1.0

Tester {
width: 200
height: 200
}

这一切都是用 qmake 文件构建的(在 Debian-Wheezy amd64 上使用 Qt 4.8)

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 类?我当然没有任何问题在 QML 文件中定义一个 MouseArea 并让它对 QML 状态做一些事情,并且从中减少的代码在 C++ 项之间互操作的信号和插槽方面没有问题和 QML 代码...但是当涉及到鼠标/键盘事件时,在 C++ 端没有它们的迹象。

最佳答案

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

setAcceptedMouseButtons(Qt::LeftButton);

TestItem 构造函数中。这有点令人惊讶,因为继承的 QGraphicsItem::setAcceptedMouseButtons 的文档说“默认情况下,接受所有鼠标按钮”,但可能设置中的其他内容与状态混淆。

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

关于c++ - 为什么我的 QDeclarativeItem 没有收到任何鼠标/键盘事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17128533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com