首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不使用paintGL函数外部的鼠标事件绘制形状- QT OpenGL C++

在QT OpenGL C++中,可以通过重写QWidget的鼠标事件函数来实现不使用paintGL函数外部的鼠标事件绘制形状。

首先,需要在自定义的OpenGL窗口类中重写QWidget的鼠标事件函数,例如mousePressEvent、mouseMoveEvent和mouseReleaseEvent。这些函数分别用于处理鼠标按下、鼠标移动和鼠标释放事件。

在mousePressEvent函数中,可以记录鼠标按下时的坐标,并设置一个标志位来表示正在绘制形状。

在mouseMoveEvent函数中,可以根据鼠标移动时的坐标更新形状的绘制参数,例如形状的大小、位置等。

在mouseReleaseEvent函数中,可以根据鼠标释放时的坐标完成形状的绘制,并重置标志位。

以下是一个示例代码:

代码语言:txt
复制
class MyGLWidget : public QGLWidget
{
    Q_OBJECT

public:
    MyGLWidget(QWidget *parent = 0) : QGLWidget(parent)
    {
        // 初始化标志位
        isDrawing = false;
    }

protected:
    void mousePressEvent(QMouseEvent *event)
    {
        // 记录鼠标按下时的坐标
        startPoint = event->pos();
        // 设置标志位为正在绘制
        isDrawing = true;
    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        if (isDrawing)
        {
            // 根据鼠标移动时的坐标更新形状的绘制参数
            currentPoint = event->pos();
            // 更新形状的绘制参数,例如形状的大小、位置等
            update();
        }
    }

    void mouseReleaseEvent(QMouseEvent *event)
    {
        if (isDrawing)
        {
            // 根据鼠标释放时的坐标完成形状的绘制
            endPoint = event->pos();
            // 重置标志位
            isDrawing = false;
            // 更新形状的绘制参数,例如形状的大小、位置等
            update();
        }
    }

    void paintGL()
    {
        // 在paintGL函数中根据形状的绘制参数绘制形状
        if (isDrawing)
        {
            // 绘制形状,例如绘制一个矩形
            glBegin(GL_QUADS);
            glVertex2f(startPoint.x(), startPoint.y());
            glVertex2f(endPoint.x(), startPoint.y());
            glVertex2f(endPoint.x(), endPoint.y());
            glVertex2f(startPoint.x(), endPoint.y());
            glEnd();
        }
    }

private:
    bool isDrawing;
    QPoint startPoint;
    QPoint endPoint;
};

这段代码演示了如何在QT OpenGL C++中实现不使用paintGL函数外部的鼠标事件绘制形状。在mousePressEvent函数中记录鼠标按下时的坐标,并设置标志位表示正在绘制。在mouseMoveEvent函数中根据鼠标移动时的坐标更新形状的绘制参数。在mouseReleaseEvent函数中根据鼠标释放时的坐标完成形状的绘制,并重置标志位。在paintGL函数中根据形状的绘制参数绘制形状。

这个示例中使用了OpenGL的绘制函数glBegin和glEnd来绘制一个矩形,你可以根据需要修改绘制的形状和绘制函数。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务:https://cloud.tencent.com/product/tke
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发平台:https://cloud.tencent.com/product/mwp
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/tbaas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

讲解pyqt5 opengl demo

函数实例,并进行初始化。...实际应用场景:创建一个简单二维图形绘制工具,使用 PyQt5 和 OpenGL 实现。...当用户点击鼠标左键时,在OpenGL窗口中绘制一个红色点,并更新显示。 运行这段代码后,将会弹出一个窗口。当你在窗口内点击鼠标左键时,会在点击位置绘制一个红色点。...你可以多次点击鼠标左键,在不同位置绘制多个点。 这个示例演示了如何在OpenGL窗口中绘制2D图形,并且响应鼠标事件实现用户交互。你可以根据实际需要进一步扩展和定制功能,添加更多绘制元素和功能。...信号与槽机制:PyQt5采用Qt信号与槽机制,这是一种强大事件驱动编程模型。信号是Qt对象发出事件,槽是对这些事件做出响应函数。通过信号与槽机制,可以实现对象之间通信和交互。

47410
  • 初学Qt(二) 中高级功能列举

    二、中级功能: 布局管理 如果项目对UI美化有比较重要需求,那么样式表和控件布局管理就要侧重很多,使用样式表可以做出很多精美的控件,可惜我咋熟。最后控件布局管理属于基础需求。...事件处理:①比如当你点击鼠标左键,想弹出一个“祝祖国70华诞快乐”对画框,可以选择重新实现鼠标点击事件。...二维图形:Qt二维图形是基于QPainter类。QPainter既可以绘制几何形状,如点、线、圆、弧形、饼状图、多边形、贝塞尔曲线等,也可以绘制像素映射、图像和文字。...OpenGL是一个绘制三维图形标准库,QT里面使用QtOpenGL模块简化了OpenGL代码与Qt应用程序之间继承。 项目视图:即Model/View,Qt中一种使UI显示和底层数据分离手段。...一种是继承QThread重新实现run()函数方式,注意,这里只有run()内部分运行在线程中;另一种是使用moveToThread()将需要运行在线程中部分放在槽函数中,使用该方式比较容易将Socket

    1.4K20

    2.通过QOpenGLWidget绘制三角形

    参考:1.opengl绘制三角形 1.QOpenGLWidget早先版本 QGLWidget是遗留Qt OpenGL模块一部分,和其他QGL类一样,应该在新应用程序中避免使用。...QOpenGLWidget提供显示集成到Qt应用程序中OpenGL图形功能。...QOpenGLWidget提供了三个方便虚拟函数,子类中重新实现这些函数来执行OpenGL绘制任务: paintGL():渲染OpenGL场景。...该函数里面主要绘制部件,比如在全屏视频上面显示滑动条 resizeGL ():当窗口尺寸发生变化时被调用,然后会调用paintGL()函数重新绘制一次(并且第一次显示时也会调用resizeGL() )。...然后在paintGL()中,每次当我们要绘制不同物体时,便调用bind()来绑定对象、绘制完后,解绑对象,如果还要绘制下个物体,那么就取出对应VAO,绑定它,绘制完物体后,再解绑。

    2.1K10

    Qt5 新特性

    这种新语法允许将一个信号连接到任意 C++ 接受者上,包括 C++11 lambda 表达式,成员函数以及 static 函数。这些接受者不必非得声明为 slots。...Qt3D 包含两个库: Qt3DQuick – 使用 QML 处理 3D 内容,基于 OpenGL Qt3D – 支持 Qt3DQuick C++ 类,也可以直接使用 现在,Qt3D 包含: GL...相比于 Qt Mobility 提供版本,Location API 则有下面的几点改变: 现在地图是 QML2 场景图一部分,直接使用直接 OpenGL 硬件渲染 使用 MapQuickItem...Qt 应用程序可以接受来自更多鼠标按键 Button 事件:在 XCB、XLIB 或 DirectFB 上达 27 个鼠标键;在 Wayland、Evdev 或 OS X 上达 16 个鼠标键;在 Blackberry...其顺序是在具有处理器 MouseArea 中从上往下传递。你也可以在处理函数中忽略这些事件,让它们继续传递。这种行为通过新属性 propagateComposedEvents 触发。

    8.1K80

    一个程序员应该怎样学会编写带GUI程序?

    众说纷纭,有人列举了许多实现GUI界面的类库,例如C++QT、MFC,PythonTkinter等。但是这些类库是如何显示呢?...形状装配(Shape Assembly):将所有的点装配成指定图元形状。...OpenGL封装了不同操作和不同显式驱动之间差异,让不同软件可以使用一套统一接口控制屏幕绘制。...用稍为正式语句表达,OpenGL是用于渲染2D、3D矢量图形跨语言、跨平台应用程序编程接口(API),由近350个不同函数组成。...这些函数并不是天生被支持OpenGL对显卡支持是依赖于版本更新。OpenGL像一个适配插头,处在软件和系统之间。 OpenGL作为一个开放图形库,并不是唯一

    2.9K10

    Qt5 和 OpenCV4 计算机视觉项目:6~9

    本章将涵盖以下主题: OpenGL 简介 在 Qt使用 OpenGL 使用 OpenGL 在 GPU 上过滤图像 在 OpenCV 中使用 OpenGL 技术要求 必须具备 C 和 C++ 编程语言基本知识才能遵循本章...三角形是 OpenGL 中最原始形状,因为我们在 OpenGL绘制几乎所有东西都是由三角形组成。...在本书中,我们不会过多关注 3D 渲染,因此我们将每个顶点z坐标设置为 0.0,以将三角形绘制为 2D 形状OpenGL 使用称为规范化设备坐标(NDC)坐标系。...至此,绘制三角形工作已经完成,但是我们还有更多工作要做:我们调用glfwPollEvents函数以捕获发生在窗口上事件,并通过窗口对象调用glfwSwapBuffers函数来显示我们绘制图形。...在本节中,我们将使用其中一些函数Qt使用 OpenGL 绘制一个三角形。

    3.2K30

    Windows桌面暗水印方法与C++实现

    窗体实现 使用C++创建一个窗体,并置顶,为窗体设置合适透明度,就能达到透明水印效果。...为了让被覆盖其它窗体能正常响应鼠标事件,需要屏蔽自己窗体鼠标事件 本文所讲方法就是使用窗体实现 DirectX实现 许多全屏游戏画面是由DirectX或OpenGL绘制,此时所有窗体都会被屏蔽,...我所能想到方法是Hook到显卡驱动,在DirectX绘图之后执行自己绘图代码 半透明窗体 使用Qt创建一个窗体,修改windowOpacity值为0.5,即可实现半透明5148 事件传递与窗体属性...句柄 获取Qt窗体句柄 hwnd = (HWND)this->winId(); 鼠标事件 透明窗体仍会响应鼠标事件使用 WA_TransparentForMouseEvents 属性即可让窗体将鼠标事件传递到窗体下方...,此时可以隔着窗体操作下面的其它窗体,甚至隔着窗体玩游戏 //将鼠标事件传递到窗体之下 this->setAttribute(Qt::WA_TransparentForMouseEvents, true

    2.2K20

    C++学习(一五九)Qt场景图Scene Graph

    qt场景图是根据界面元素位置、透明等信息构建出来,而osg场景图是直接利用节点构建出来。也就是用户直接参与qt场景图构建,但是直接参与osg场景图构建。...该树是根据QML场景中QQuickItem类型构建,然后在内部由渲染该场景渲染器处理该场景。节点本身包含任何活动绘图代码或虚拟paint()函数。...它用于通过定义其几何形状和材质来定义自定义图形。使用QSGGeometry定义几何形状,并描述图形图元形状或网格。它可以是直线,矩形,多边形,许多不连续矩形或复杂3D网格。...例如,这可能是动画或用户输入结果。事件被发布到渲染线程以启动新帧。 2、渲染线程准备绘制新帧。...缺点是Qt Quick决定何时调用信号,这是唯一允许OpenGL应用程序绘制时间。

    2.3K40

    Qt编写安防视频监控系统27-GPU显示

    GPU使用率有了,但是依然耗时操作还是在CPU绘制显示,这就显得很尴尬了,Qt封装了大部分opengl操作,直接做成了QOPenGLWidget,既支持ffmpeg解码出来yuyv格式数据显示...,还支持硬解码出来nv12格式数据显示,很好很强大,这样的话就大大减轻了CPU压力,专门交给GPU绘制,经过这么一番彻底改造,效率提升至少5倍,不要太牛逼!...如果开启了opengl绘制,则对应内存会增加不少,可能opengl绘制需要开辟很多内存来交换数据吧。...采用GPU显示需要同时支持yuyv格式和nv12格式,因为有些配置差电脑,硬解码很可能歇菜,此时就需要用opengl来直接绘制ffmpeg软解码出来yuyv数据,做到自动切换,这样就兼容了所有的可能情况...默认采用opengl绘制视频,超低CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼。 高度可定制化,用户可以很方便在此基础上衍生自己功能,支持linux和mac系统。

    1.2K00

    关于MFC与OpenGL结合绘图区域用鼠标来控制图形移动总结

    我就想着用MFC界面来开发,但是呢MFC对话框 或者单文档跟OpenGL结合绘图区域,添加了鼠标移动消息响应函数,可是鼠标移动坐标打印告诉我,两者结合之后 不仅左上角坐标不是(0,0)右下角也不是常规长宽坐标...  反正移动起来坐标跳动非常规律,一会一百多,一会就几千,可是界面定义长宽只有几百而已,这就是一个非常纠结地方了,在MFC下与OpenGL结合 我不能通过鼠标移动坐标来控制模型移动了,...没办法,项目需要界面,那我只能重新学习c#或者是QT来制作这个界面了,最后花了一天多学了c#winform界面开发,opengl是不可以直接在c#中使用,只能用一些大牛对接 比如sharpGL ...CsharpGL来制作绘制。...不过语法都差不多  c#中鼠标控制良好 可以非常轻松实现图形拖动旋转一系列操作 若有兴趣交流分享技术,可关注本人公众号,里面会不定期分享各种编程教程,和共享源码,诸如研究分享关于c/c++,python

    1.2K20

    OpenGL现代编程第二课——第一个多边形

    下面串接一下上面的概括: 开始绘制图形之前,我们必须先给OpenGL输入一些顶点数据,当然,这些数据是有范围限制,如范围是-1.0f到1.0f,数据需要是三维等等。...注意还有一个VAO,它使得顶点属性调用更加方便,而且OpenGL核心模式要求我们使用VAO。 顶点着色器(Vertex Shader)是几个可编程着色器中一个。...首先要做第一件事是用着色器语言GLSL(OpenGL Shading Language)编写顶点着色器,然后编译着色器,之后才能在程序中使用它。...已激活着色器程序着色器将在我们发送渲染调用时候被使用。 最后绘制三角形。...可能有些地方比喻恰当,望大家不吝指正,感谢!

    70610

    C++ Qt开发:Charts绘制各类图表详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽方式将不同组件放到指定位置,实现图形化开发极大方便了开发效率,本章将重点介绍TreeWidget...::AlignRight); 设置饼图分块标签和槽函数关联: 对于每个分块,设置其标签文字,包括数值和百分比,并关联鼠标悬停事件函数。...QSplineSeries 是 Qt Charts 模块中用于绘制光滑曲线类。它表示图表中一条曲线,通过一系列数据点来定义曲线形状。...QSplineSeries 主要用于绘制光滑曲线,通过添加一系列数据点,可以在图表中呈现出相应曲线形状。 QScatterSeries 是 Qt Charts 模块中用于绘制散点图类。...setUseOpenGL(bool enable) 设置是否使用 OpenGL 进行绘制。 useOpenGL() 返回是否使用 OpenGL 进行绘制

    86410

    C++ Qt开发:Charts绘制各类图表详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽方式将不同组件放到指定位置,实现图形化开发极大方便了开发效率,本章将重点介绍TreeWidget...如下代码是使用 Qt 图表模块创建一个包含柱状图和折线图图表,并显示在 QGraphicsView 控件中,在MainWindow::MainWindow构造函数中我们可以使用如下代码实现柱状图创建...::AlignRight);设置饼图分块标签和槽函数关联: 对于每个分块,设置其标签文字,包括数值和百分比,并关联鼠标悬停事件函数。...QSplineSeries 是 Qt Charts 模块中用于绘制光滑曲线类。它表示图表中一条曲线,通过一系列数据点来定义曲线形状。...QSplineSeries 主要用于绘制光滑曲线,通过添加一系列数据点,可以在图表中呈现出相应曲线形状。QScatterSeries 是 Qt Charts 模块中用于绘制散点图类。

    2.2K00

    OpenGL及其相关开源库:深入探析图形编程工具与原理

    事件处理:GLFW能够处理各种事件,包括键盘事件鼠标事件、窗口事件等。开发者可以注册回调函数来处理这些事件,从而实现与用户交互。...在早期OpenGL版本中,开发者通常会直接使用GL库来进行基本图形绘制,例如通过调用glBegin()和glEnd()来指定绘制几何形状,并使用glVertex()来指定顶点坐标。...它提供了一组简单易用函数,如创建窗口、处理键盘和鼠标输入、管理窗口事件等。通过使用GLUT,开发者可以快速地搭建起一个基本OpenGL应用程序框架,而无需关注底层窗口管理和事件处理细节。...相比于GLUT,FreeGLUT在功能上进行了一些改进和扩展,如支持多窗口、支持更多键盘和鼠标事件、提供了更多定时器函数等。...GLAD可以根据用户指定OpenGL版本和扩展列表自动生成相应加载代码,并且支持多种编程语言,如C/C++、Python等,使得开发者可以在不同开发环境中使用

    1.6K10
    领券