Ввод с клавиатуры в пользовательском QQuickPaintedItem - PullRequest
0 голосов
/ 05 мая 2020

Я определил свой собственный 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();

}

Как видите, код действительно прост. Прямоугольник на экране успешно нарисован, но нажатие на стрелки ничего не дает. Это неправильный метод? Если да, то как я могу обработать ввод с клавиатуры?

1 Ответ

0 голосов
/ 06 мая 2020

Для того, чтобы элемент получил событие мыши, он должен соответствовать следующему:

  • включить флаг 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...