首页 > 解决方案 > 自定义 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();

}

如您所见,代码非常简单。矩形在屏幕上成功绘制,但按箭头没有任何作用。这是一个错误的方法吗?如果是这样,我该如何处理键盘输入?

标签: c++qt

解决方案


一个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);
}

推荐阅读