qt QQuickItem详解

1、概述

QQuickItem是Qt Quick模块中的一个基础类,用于创建和管理Qt Quick场景图中的项。它是所有可视化项和非可视化项(如鼠标区域、触摸区域等)的基类。QQuickItem提供了许多基本功能,如位置、大小、变换、不透明度、焦点处理等,以及处理输入事件的能力。通过子类化QQuickItem,开发者可以创建自定义的可视化项和非可视化项,以满足特定的应用需求。

2、重要方法
  • setParentItem(QQuickItem *parent): 设置该项的父项。在Qt Quick的场景图中,项通过父子关系组织成一个层次结构。
  • childItems(): 返回一个列表,包含该项的所有子项。
  • contains(const QPointF &point): 判断给定的点是否在项的边界内。这对于确定用户输入(如鼠标点击或触摸)是否针对特定项非常有用。
  • setScale(qreal sx, qreal sy): 设置项的缩放比例。sx和sy分别表示水平和垂直方向的缩放比例。
  • setRotation(qreal angle): 设置项的旋转角度。角度以度为单位,正值表示顺时针旋转,负值表示逆时针旋转。
  • setTranslation(qreal tx, qreal ty): 设置项的平移量。tx和ty分别表示水平和垂直方向的平移量。
  • setOpacity(qreal opacity): 设置项的不透明度。opacity的值在0.0(完全透明)到1.0(完全不透明)之间。
  • event(QEvent *event): 处理事件的方法。子类可以重写此方法以处理特定类型的事件,如鼠标事件、触摸事件、键盘事件等。
  • mousePressEvent(QMouseEvent *event): 处理鼠标按下事件。
  • mouseMoveEvent(QMouseEvent *event): 处理鼠标移动事件。
  • mouseReleaseEvent(QMouseEvent *event): 处理鼠标释放事件。
  • keyPressEvent(QKeyEvent *event): 处理键盘按下事件。
  • keyReleaseEvent(QKeyEvent *event): 处理键盘释放事件。
  • update(): 请求项重新绘制。当项的内容发生变化时,应调用此方法。
  • updatePaintNode(QSGNode *, UpdatePaintNodeData *): 这是一个虚方法,子类可以重写它以提供自定义的渲染逻辑。它允许子类向场景图添加自定义内容。
  • setFlag(QQuickItem::Flags flags, bool enabled = true): 设置项的特定标志。这些标志可以控制项的某些行为,如是否接受触摸事件、是否接受鼠标事件等。
  • mapFromItem(const QQuickItem *item, const QPointF &point): 将另一个项中的坐标转换为当前项的坐标系统。
  • mapToItem(const QQuickItem *item, const QPointF &point): 将当前项的坐标转换为另一个项的坐标系统。
3、重要信号
  • childAdded(QQuickItem *child):当向项添加子项时发出。
  • childRemoved(QQuickItem *child):当从项中移除子项时发出。
  • visibleChanged():当项的可见性发生变化时发出。
  • opacityChanged():当项的不透明度发生变化时发出。
  • enabledChanged():当项的启用状态发生变化时发出。

这些信号允许开发者在项的状态发生变化时执行特定的操作或逻辑。

4、常用枚举类型
  • Flags:用于设置项的特定标志的枚举类型。例如,ItemIsFocusScope标志表示该项是一个焦点作用域,可以接受键盘焦点。
  • TransformOrigin:用于设置项的变换原点的枚举类型。变换原点决定了缩放、旋转等变换操作相对于项的哪个点进行。例如,TransformOrigin::TopLeft表示变换操作相对于项的左上角进行。
  • RenderFlags:用于控制项的渲染行为的枚举类型。例如,RenderFlag::ClipChildren表示在渲染时裁剪子项。
#include <QQuickItem>
#include <QSGNode>
#include <QSGGeometry>
#include <QSGSimpleRectNode>
#include <QPainter>
#include <QColor>

class CustomItem : public QQuickItem {
    Q_OBJECT
    
public:
    CustomItem(QQuickItem *parent = nullptr)
        : QQuickItem(parent),
          m_color(Qt::red) {
        setFlag(ItemHasContents, true); // 允许绘制内容
        setAcceptedMouseButtons(Qt::LeftButton);
    }

    void setColor(const QColor &color) {
        m_color = color;
        update();  // 触发重新绘制
    }

protected:
    // 重写 updatePaintNode 方法
    QSGNode* updatePaintNode(QSGNode *node, UpdatePaintNodeData *data) override {
        // 如果当前没有节点,则创建新的节点
        if (!node) {
            node = new QSGSimpleRectNode();
        }

        // 转换为矩形节点
        QSGSimpleRectNode *rectNode = static_cast<QSGSimpleRectNode *>(node);

        // 设置矩形的绘制颜色
        rectNode->setColor(m_color);


        // 设置矩形的尺寸
        rectNode->setRect(0, 0, width(), height());

        return node;
    }

// 鼠标点击事件
    void mousePressEvent(QMouseEvent *event) override {
        qDebug() << "Mouse pressed at" << event->pos();
    }

    // 鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event) override {
        qDebug() << "Mouse moved at" << event->pos();
    }

    // 鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *event) override {
        qDebug() << "Mouse released at" << event->pos();
    }


private:
    QColor m_color;
};

觉得有帮助的话,打赏一下呗。。

           

需要商务合作(定制程序)的欢迎私信!! 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值