簡體   English   中英

自定義 QQuickPaintedItem 中的鍵盤輸入

[英]Keyboard input in custom 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中完成。

另一方面,如果您的目標是在 window 上繪制一個矩形,那么您在繪畫使用什么坐標的概念上存在錯誤,繪畫使用的是局部坐標而不是 window 或屏幕。 因此,您應該只使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM