c++ - 自定义 QQuickPaintedItem 中的键盘输入
问题描述
我以这种方式定义了我的自定义 QQuickPaintedItem:
class NiceItem : public QQuickPaintedItem
{
...
public:
...
void keyPressEvent(QKeyEvent * event);
void paint(QPainter *painter);
...
};
这里有keyPressEvent
代码:
void NiceItem::keyPressEvent(QKeyEvent * event)
{
if(event->key() == Qt::Key_Left)
playerX--;
else if(event->key() == Qt::Key_Right)
playerX++;
else if(event->key() == Qt::Key_Up)
playerY--;
else if(event->key() == Qt::Key_Down)
playerY++;
}
这是paint
代码:
void NiceItem::paint(QPainter *painter)
{
QPen pen(m_color, 2);
painter->setPen(pen);
QRectF rectangle(playerX, playerY, 80.0, 60.0);
painter->drawRect(rectangle);
update();
}
如您所见,代码非常简单。矩形在屏幕上成功绘制,但按箭头没有任何作用。这是一个错误的方法吗?如果是这样,我该如何处理键盘输入?
解决方案
一个Item要接收鼠标事件,它必须满足以下条件:
- 启用标志 QQuickItem::ItemIsFocusScope。
- 有了重点,这可以在 C++ 中使用
setFocus(true)
或在 QML 中完成:focus: true
.
另一方面,如果您的目标是在窗口上绘制一个矩形,那么您在绘画使用什么坐标的概念上存在错误,绘画使用的是局部坐标而不是窗口或屏幕。position()
因此,您应该只使用, x()
, y()
(及其设置器)来修改几何图形,而不是创建新属性,因为这些元素是相对于父坐标的。
#ifndef NICEITEM_H
#define NICEITEM_H
#include <QQuickPaintedItem>
class NiceItem : public QQuickPaintedItem
{
Q_OBJECT
public:
NiceItem(QQuickItem *parent=nullptr);
void paint(QPainter *painter);
protected:
void keyPressEvent(QKeyEvent *event);
private:
QColor m_color;
};
#endif // NICEITEM_H
#include "niceitem.h"
#include <QPainter>
#include <QPen>
NiceItem::NiceItem(QQuickItem *parent):
QQuickPaintedItem(parent), m_color(QColor("red"))
{
setFlag(QQuickItem::ItemIsFocusScope, true);
setFocus(true);
setSize(QSizeF(80.0, 60.0));
}
void NiceItem::paint(QPainter *painter)
{
QPen pen(m_color, 2);
painter->setPen(pen);
painter->drawRect(boundingRect());
}
void NiceItem::keyPressEvent(QKeyEvent *event)
{
QPointF delta;
if(event->key() == Qt::Key_Left)
delta = QPointF(-1, 0);
else if(event->key() == Qt::Key_Right)
delta = QPointF(+1, 0);
else if(event->key() == Qt::Key_Up)
delta = QPointF(0, -1);
else if(event->key() == Qt::Key_Down)
delta = QPointF(0, +1);
setPosition(position() + delta);
}
推荐阅读
- vue.js - 将 shell 输出流式传输到 Web 前端
- java - Java JSP Servlet,为什么我的 css 不起作用。谢谢
- java - 下载文件时 Java 崩溃
- javascript - 无法使用 OctoPrint 事件 API 中的 config.yaml 将参数传递给 JavaScript 文件
- reactjs - 在反应中使用 cookie 的客户端身份验证和受保护的路由
- java - 执行 ValueEventListener 时活动崩溃
- python - 如何在 LSTM 中输入特征提取的视频帧?
- python - 创建一个基本的 RESTful 设计
- string - Scala中两个字符串的差异
- python - 我应该如何为 sparse_categorical_crossentropy 损失函数设置我的数据?