百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

Qt quick用OpenGL在image上逐点画轨迹二维点

citgpt 2024-07-12 09:51 17 浏览 0 评论

如果要在Qt Quick中使用OpenGL在Image上逐点画轨迹,需要对上面的代码进行修改。下面是一个简单的示例:

1.首先,我们需要在QML文件中加载OpenGL,并创建一个绘制线条的函数:

Qt quick用OpenGL在image上逐点画轨迹二维点

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.0
import QtOpenGL 2.0

Window {
    id: mainWindow
    width: 640
    height: 480
    visible: true

    // 创建OpenGL窗口
    OpenGLSurface {
        id: glSurface
        anchors.fill: parent
        antialiasing: true
        focus: true

        // 设置OpenGL属性
        property variant glContext: undefined
        property variant glFunctions: undefined
        property bool isDrawing: false
        property int lastX: -1
        property int lastY: -1

        Component.onCompleted: {
            glContext = context;
            glFunctions = context.functions;
            // 设置OpenGL参数
            glFunctions.glViewport(0, 0, width * mainWindow.devicePixelRatio, height * mainWindow.devicePixelRatio);
            glFunctions.glClearColor(0, 0, 0, 1);
            glFunctions.glClear(glFunctions.GL_COLOR_BUFFER_BIT | glFunctions.GL_DEPTH_BUFFER_BIT | glFunctions.GL_STENCIL_BUFFER_BIT);
            glFunctions.glEnable(glFunctions.GL_BLEND);
            glFunctions.glBlendFunc(glFunctions.GL_SRC_ALPHA, glFunctions.GL_ONE_MINUS_SRC_ALPHA);
        }

        // 在OpenGL上画线
        function drawLine(x1, y1, x2, y2, color) {
            glFunctions.glLineWidth(2);
            glFunctions.glBegin(glFunctions.GL_LINES);
            glFunctions.glColor4f(color.r, color.g, color.b, color.a);
            glFunctions.glVertex2f((x1 * 2 / width - 1), (y1 * 2 / height - 1));
            glFunctions.glVertex2f((x2 * 2 / width - 1), (y2 * 2 / height - 1));
            glFunctions.glEnd();
        }

        // 绘制完成后更新OpenGL
        onFrameSwapped: {
            glContext.swapBuffers();
        }
    }

    // 加载图片
    Image {
        id: img
        source: "qrc:/image.png"
        visible: true

        // 鼠标按下事件,开始绘制
        MouseArea {
            anchors.fill: parent
            onPressed: {
                glSurface.isDrawing = true;
                glSurface.lastX = mouse.x;
                glSurface.lastY = mouse.y;
            }
            // 鼠标移动事件,绘制轨迹
            onPositionChanged: {
                if (glSurface.isDrawing) {
                    var color = Qt.rgba(1, 0, 0, 1);
                    glSurface.drawLine(glSurface.lastX, glSurface.lastY, mouse.x, mouse.y, color);
                    glSurface.lastX = mouse.x;
                    glSurface.lastY = mouse.y;
                }
            }
            // 鼠标释放事件,停止绘制
            onReleased: {
                glSurface.isDrawing = false;
            }
        }
    }
}

C++开发交流+赀料君羊:666064665

2.在OpenGLSurface组件中,我们添加了两个属性:isDrawing表示是否正在绘制,lastX和lastY表示上一个点的坐标位置。

3.通过drawLine()函数,我们可以在图片上绘制线条。我们使用glLineWidth()函数设置线条宽度,然后使用glColor4f()函数设置线条颜色。最后,我们使用glVertex2f()函数指定线条的两个端点位置。

4.在Image组件中,我们添加了一个MouseArea鼠标事件处理器。在鼠标按下时,我们将isDrawing设为true,并记录鼠标的坐标作为起点。在鼠标移动时,如果isDrawing为true,则根据上一个点和当前点的坐标绘制一条线条。在鼠标释放时,将isDrawing设为false。

注意:这个示例只是一个简单的演示,实际使用中需要考虑性能问题,比如对轨迹进行优化、清除缓存等。

相关推荐

Linux系统中的sudo命令、APT软件包管理器以及Java开发工具包JDK

sudo命令详解:sudo命令允许用户以root权限执行命令,类似于Windows系统中的“以管理员身份运行”。这在需要系统级权限操作时非常有用。更多信息请参考:https://do...

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解释器。 它提供了一种独立于操作系统的运行环境,使得Java程序在任...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐藏。通过定义这个剪切路径(clippingpath),您可以创造出非矩形的裁剪...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
Redis和Memcached的区别详解

Redis的作者SalvatoreSanfilippo曾经对这两种基于内存的数据存储系统进行过比较:1.Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰...

2024-10-25 11:51 citgpt

Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果。promise.all中只要有一个失败了,走.catch(),在.catch(...

2024-10-24 16:21 citgpt

取消回复欢迎 发表评论: