Для того, чтобы элемент получил событие мыши, он должен соответствовать следующему:
- включить флаг 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);
}