精华内容
下载资源
问答
  • Qt OpenGL三维绘图

    2014-10-26 23:27:00
    OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持。OpenGL*应用程序的用户界面必须由其它工具包创建,比如在X平台下的Motif,在Windows平台下的微软基本类库(MFC)——或是在这两...
     简介

    OpenGL是为三维绘图提供的标准应用编程接口。

    OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持。OpenGL*应用程序的用户界面必须由其它工具包创建,比如在X平台下的Motif,在Windows平台下的微软基本类库(MFC)——或是在这两种平台下都能使用的Qt。

    Qt的OpenGL模块使在Qt应用程序中使用OpenGL变的更加容易。它提供了一个OpenGL的部件类,这个部件类除了打开一个OpenGL显示缓冲,利用这个缓冲使用OpenGL应用编程接口来提供内容外,能像其它Qt部件那样的使用,。

    Qt OpenGL模块的运作是一个与平台无关的Qt/C++的包装,这个包装则是和平台有关的GLX、WGL或AGL的C的应用编程接口。 其提供的功能则是和Mark Kilgard的GLUT库极为相似,但是Qt的OpenGL模块还有更多的非OpenGL特有的GUI机能,即它们都是Qt的应用编程接口。

     

    安装

    当你在X11中安装Qt时候,配置脚本将会自动检测你的系统上是否已安装了OpenGL的头文件和库,如果已正确安装了,在Qt的库中就会包括Qt OpenGL模块。(如果你的OpenGL头文件或库放置在一个非标准的目录下,你需要根据你的系统而修改config文件中的SYSCONF_CXXFLAGS_OPENGL和/或 SYSCONF_LFLAGS_OPENGL)。 对于OpenGL的一些配置需要线程生效,所以如果OpenGL没有被检测到,试一下configure -thread

    当你在Windows中安装Qt时候,Qt的OpenGL模块总是被包含的。

    Qt的OpenGL模块的使用没有授权给Qt专业版,如需要OpenGL支持的话,可以考虑升级为Qt企业版。

    在X11上使用Mesa时请注意: Mesa 3.1之前的版本在库中使用的名为“MesaGL”和“MesaGLU”,而不是“GL”和“GLU”。如果你想使用Mesa 3.1之前的版本的话,你必须改变Makefile来使用这些库的名字。最简单的方法就是编辑config文件中的SYSCONF_LIBS_OPENGL行,将“-lGL -lGLU”改成“-lMesaGL -lMesaGLU”,然后再次运行“configure”。

     

    QGL

    在Qt中OpenGL提供支持的类为:

    • QGLWidget:一个容易使用的Qt部件,它提供了OpenGL场景。
    • QGLContext:封装了OpenGL提供的上下文。
    • QGLFormat:对于一个给定的上下文,指定特定的显示模式。
    • QGLColormap:在GL-index中处理编入索引的colormaps。

    许多应用程序仅需要高等级的QGLWidget类。其它的QGL类提供了高级特性。X11的用户可能要阅读一下overlays中的注释。

    参照OpenGL实例

    QGL的文档假设你熟悉OpenGL编程。如果你在这方面是个新手的话,一个好的起点就是http://www.opengl.org/

    *OpenGL是Silicon Graphics公司在美国和其它国家的注册商标。

    转载于:https://www.cnblogs.com/lvdongjie/p/4053060.html

    展开全文
  • 13-Qt5数学三维绘图

    千次阅读 2019-08-27 19:32:31
    13-Qt5数学三维绘图 1. 第三方库:mathgl 本期视频主要介绍使用mathgl库进行数学函数绘制,主要是三维函数绘图,网上还有关于QPlotQwt3D的教程,但是这个第三方库太旧已经很久没有更新了,使用时有很多问题,最终...

    13-Qt5数学三维绘图

    1. 第三方库:mathgl

    本期视频主要介绍使用mathgl库进行数学函数绘制,主要是三维函数绘图,网上还有关于QPlotQwt3D的教程,但是这个第三方库太旧已经很久没有更新了,使用时有很多问题,最终选择了mathgl

    • 下载地址:http://mathgl.sourceforge.net/doc_en/Download.html

      Windows系统环境使用的话直接下载LGPL版本调用动态库即可(支持Qt5.12.4,mingw7.3.0 64位版本),笔者试着像GSLOpenCV4那样手动编译,但是失败了,最后还是选择使用官方自己提供的动态库,如果是在Linux环境下是可以直接编译运行使用的。

    • 添加bin目录至环境变量

    2.Qt工程导入mathgl

    • 复制mathgl文件夹至工程目录路径下

    • 编写.pri文件:

      # 宏定义项,指明采用maghtl
      
      DEFINES += MATHGL_DLL
      
      # 指明maghtl库所对应的头文件所在目录
      INCLUDEPATH += $$PWD/include
      
      # 链接静态库
      #CONFIG += static
      # 指明依赖库关系
      LIBS += -L$$PWD/lib/ -lmgl-qt5 -lmgl
      
    • pro文件导入mathgl.pri

    • 编写mainwindow.cpp代码:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QScrollArea>
    #include <mgl2/qmathgl.h>
    #include "mgl2/qt.h"
    #include <QDebug>
    #include <QLineEdit>
    
    const char *expr;   // here `expr` is a global variable
    
    int example(mglGraph *gr)
    {
        gr->Rotate(20,40);
        gr->SetRanges(-3,3,-3,3,-1,1);
        //    gr->FSurf("sin((x^2+y^2))/sqrt(x^2+y^2+1)");
        //    qDebug() << expr << endl;
        gr->FSurf(expr);
        //    gr->Drop(mglPoint(0,0,3),mglPoint(0,0,-1),0.7,"b");
        gr->Box();
        gr->Axis();
        gr->Rotate(50,60);
        gr->Title("Sample Plot!","", -1);   // -1 is the font size of title
        return 0;
    }
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QMGL = new QMathGL(ui->widget);
    }
    
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        QString str = ui->lineEdit->text();
        QByteArray byte = str.toLocal8Bit();
        expr = byte.data();     // update the variable `expr`, convert QString to const chat
        //    QMGL = new QMathGL(ui->widget);
        QMGL->setDraw(example);
        QMGL->adjust();
        //    QMGL->setGrid(true);
        QMGL->setZoom(true);
        QMGL->setRotate(true);
        QMGL->update();
    }
    
    • 需要改为Release发布方式,因为调用的动态库是Release模式的,否则会报错

    如果小伙伴们对文章内容有不理解的地方可以查看博主制作的相对应视频教程哦:
    https://www.bilibili.com/video/av65138381

    展开全文
  • PyQtDataVisualization三维绘图 Data Visualization是Qt中的一个三维数据可视化模块,可以绘制三维柱状图、三维散点图、三维曲面图等。Data Visualization模块的功能虽然不能和一些专业的三维图形类库(如VTK)...

    PyQtDataVisualization三维绘图

    Data Visualization是Qt中的一个三维数据可视化模块,可以绘制三维柱状图、三维散点图、三维曲面图等。Data Visualization模块的功能虽然不能和一些专业的三维图形类库(如VTK)相提并论,但是它简单易用,对于简单的三维数据显示是比较实用的。PyQt5中并没有Data Visualization模块,需要单独安装PyQtDataVisualization包。

    一、PyQtDataVisualization模块概述

    1.1.模块安装与导入
    Data Visuallzation是Qt类库的一部分,但是安装的PyQt5里并没有这个模块,需要单独安装PyQtData Visualization包。PyQtData Visualization也是Riverbank出品的,其最新的版本与PyQt5一致。要安装PyQtDataVisual,只需在Windows的cmd窗口里执行下面的命令:

    pip install PyQtDataVisualization
    

    这样将会自动从PyPi网站上下载安装最新版本的PyQtDataVisualization。本书使用的版本是PyQtData Visualzation5.12。
    PyQtData Visualization安装后的类都在PyQt5.QtDataVisualization模块中,所以程序中要使用其中的类时,import 语句示例如下:

    from PyQt5.QtDataVisualization import Q3DBars,QBar3DSeries
    

    1.2.模块中主要的类
    PyQtDataVisualization的三维绘图功能主要由三种三维图表类实现,分别是三维柱状图类Q3DBars、三维散点图类Q3DScatter和三维曲面类Q3DSurface。这三个类的父类是QAbstract3DGraph,它是从Qwindow继承而来的。

    一个三维图也是由图表、序列、坐标轴等元素组成的。Q3DBars、Q3DScatter、Q3DSurface相当于PyQtChart中的QChart,而每一种三维图表对应一种三维序列,三种三维序列类的继承关系。

    一种序列类只能用于一种三维图表类,例如QBar3DSeries只能作为三维柱状图Q3DBars的序列,而不能作为三维散点图Q3DScatter的序列。在一个图中可以有多个不同类型的序列,例如三维曲面图Q3DSurface中可以有多个QSurface3DSeries序列,用于显示不同的曲面。

    有两种坐标轴类可应用于三维图表,其中QValue3DAxis是数值型坐标轴,QCategory3DAxis是文字类别坐标轴,它们都继承自QAbstract3DAxis。

    PyQtDataVisualization模块中有数据代理(data proxy)类。数据代理类就是与序列对应,用于存储序列的数据的类。因为三维图表类型不一样,存储数据的结构也不一样,例如三维散点序列QScatter3DSerier存储的是三维数据点的空间坐标,只需要用一维数组或列表就可以存储这些数据,而QSurface3DSeries序列存储的数据点在水平面上是用网格划分的,需要二维数组才可以存储相应的数据。为此,对于每一种序列,都有一个数据代理类,它们都继承自QAbstractDataProxy,每个数据代理类还有一个基于项数据模型的数据代理类。

    对于三维曲面序列QSurface3DSeries,还有一个专门用于显示地图高程数据的数据代理类QHeightMapSurfaceDataProxy,可以将一个图片表示的高程数据显示为三维曲面。用户也可以根据需要从QAbstractDataProxy继承,定义自己的数据代理类。

    一个完整的三维曲面图表就由这些类的对象组成,例如对于一个三维散点图,其基本组成是:Q3DScatter作为图表类;QScatter3DSeries作为序列类;QScatterDataProxy作为序列的数据代理类,用于存储空间散点的坐标数据。三个坐标轴都是数值数据,所以都使用QValue3DAxis类。

    展开全文
  • 在这段代码的前面,我已经生成了node,normal,el这个数组。node是节点的坐标,按照顺序xyz排好了;normal是节点法向量;el是单元列表。这个数组我已经反复debug过了多遍,应该没有问题。 但是在生成数组之后...
  • 三维窗口中绘制一个立方体,设置鼠标在屏幕上划线(鼠标的moveEvent),立方体按鼠标划线方向旋转 功能我是实现了的(Qt4教程20章里有类似的例子) 问题变得有意思了 鼠标划线(上->下,下->上),...
  • Qt学习:三维绘图之OpenGL和Qt的结合

    万次阅读 多人点赞 2013-05-13 19:21:28
    Qt应用程序可以使用QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库。Qt OpenGL模块提供QGLWidget类,可以通过对它子类化,并使用OpenGL命令开发出自己的窗口部件。对许多三维应用程序来说,这就足够了。  ...

            OpenGL是绘制三维图形的标准API。Qt应用程序可以使用QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库。Qt OpenGL模块提供QGLWidget类,可以通过对它子类化,并使用OpenGL命令开发出自己的窗口部件。对许多三维应用程序来说,这就足够了。
            这节假设大家都已经学过OpenGL,这样我们就无后顾之忧了。
            在Qt中绘制OpenGL通常需要做以下工作:1)、必须子类化QGLWidget;2)、实现几个虚函数:void initiallizeGL()
    void resizeGL(), void paintGL(), 这些都是在QGLWidget中实现的,还有一些和用户交互的虚函数,诸如void mouseMoveEvent()之类的,想必大家都比较熟了,这些虚函数是在Widget中实现的。 
            下面我们介绍一个例子。先给出该程序的效果:

     

            菜单栏里的第一项可以完成一个自定义大小的抓图,即由用户自己决定抓图的大小,抓图会显示在右侧的方框里,注意这里只能设置图形的大小小雨当前图形的尺寸, 如果大于当前图形尺寸,则钳位到当前图形尺寸。效果看起来应该是这样:

     

            菜单栏第二项也是一个抓图功能,它返回一个当前图形尺寸的图形,并填充到右侧。
            第三项即清除右侧图形。 

            这个代码由以下部件构成:
            一个QMainWindow,我们通过子类化这个类来完成自己想要的一些功能。
            一个QWidget,我们把它作为中央窗口,在其上添加自己想要的一些子部件。
            两个QScrollBar,用来盛载一个QGLWidget和一个QLabel。
            一个QGLWidget,我们通过子类化它并把它加进一个QScrollBar来实现三维绘图,即上图所示的左边窗口。
            一个QLabel,同样,我们把这个QLabel加进一个QScrollBar来接收抓图后的显示效果。
            三个QSlider,我们通过这三个滑动条控制所绘制的四面体沿x,y,z轴转动,同样鼠标拖动这个四面体也可以改变滑动条的值。
            以上是整个程序的框架。
            以下是代码的实现部分。

            MainWindow 类定义了我们整个程序的框架:

    //mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    class QAction;
    class QLabel;
    class QMenu;
    class QSlider;
    class QScrollArea;
    
    class GLWidget;
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
        
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void renderIntoPixmap();
        void grabFrameBuffer();
        void clearPixmap();
        void about();
    
    private:
    
        void createMenus();
        void createActions();
    
        QSlider *createSlider(const char *changedSignal, const char *setterSlot);
        void setPixmap(const QPixmap &pixmap);
        QSize getSize();
    
        QWidget *centralWidget;
        QScrollArea *glWidgetArea;
        QScrollArea *pixmapLabelArea;
        GLWidget *glWidget;
        QLabel *pixmapLabel;
        QSlider *xSlider;
        QSlider *ySlider;
        QSlider *zSlider;
    
        QMenu *fileMenu;
        QMenu *helpMenu;
        QAction *renderIntoPixmapAction;
        QAction *grabFrameBufferAction;
        QAction *clearPixmapAction;
        QAction *exitAction;
        QAction *aboutAction;
        QAction *aboutQtAction;
    
    };
    
    #endif // MAINWINDOW_H
    


     

            以下是程序的实现部分:

    //mainwindow.cpp
    #include <QtOpenGL>
    #include <QAction>
    #include <QLabel>
    #include <QMenu>
    #include <QSlider>
    #include <QScrollArea>
    #include <QMenuBar>
    #include <QApplication>
    
    
    #include "mainwindow.h"
    #include "glwidget.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        centralWidget = new QWidget;
        setCentralWidget(centralWidget);
    
        glWidget = new GLWidget;
        pixmapLabel = new QLabel;
    
        glWidgetArea = new QScrollArea;
        glWidgetArea->setWidget(glWidget);
        //glWidgetArea->viewport()->setBackgroundRole(QPalette::Dark);
        glWidgetArea->setWidgetResizable(true);
        glWidgetArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        glWidgetArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        glWidgetArea->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
        glWidgetArea->setMinimumSize(50, 50);
    
        pixmapLabelArea = new QScrollArea;
        pixmapLabelArea->setWidget(pixmapLabel);
        pixmapLabelArea->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
        pixmapLabelArea->setMinimumSize(50, 50);
    
        //在构造一个QSlider时将QGLWidget的信号和槽传给这个函数的形参,这样就可以在QMainWindow中
        //控制OpenGL的动作了,而让GLWidget类只完成绘图工作。
        xSlider = createSlider(SIGNAL(xRotationChanged(int)),
                               SLOT(setXRotation(int)));
        ySlider = createSlider(SIGNAL(yRotationChanged(int)),
                               SLOT(setYRotation(int)));
        zSlider = createSlider(SIGNAL(zRotationChanged(int)),
                               SLOT(setZRotation(int)));
    
        /*
        xSlider = new QSlider(Qt::Horizontal);
        ySlider = new QSlider(Qt::Horizontal);
        zSlider = new QSlider(Qt::Horizontal);
        */
    
        QGridLayout *centralLayout = new QGridLayout;
        centralLayout->addWidget(glWidgetArea, 0, 0);
        centralLayout->addWidget(pixmapLabelArea, 0, 1);
        centralLayout->addWidget(xSlider, 1, 0, 1, 2);
        centralLayout->addWidget(ySlider, 2, 0, 1, 2);
        centralLayout->addWidget(zSlider, 3, 0, 1, 2);
        centralWidget->setLayout(centralLayout);
    
        createActions();
        createMenus();
    
        xSlider->setValue(15 * 16);
        ySlider->setValue(345 * 16);
        zSlider->setValue(0 * 16);
    
        setWindowTitle(tr("Grabeer"));
        resize(480, 360);
    }
    
    void MainWindow::setPixmap(const QPixmap &pixmap)
    {
        pixmapLabel->setPixmap(pixmap);
        QSize size = pixmap.size();
        if (size - QSize(1, 0) == pixmapLabelArea->maximumViewportSize())
            size -= QSize(1, 0);
        pixmapLabel->resize(size);
    }
    
    QSize MainWindow::getSize()
    {
        bool ok;
        QString text = QInputDialog::getText(this, tr("Grabber"),
                                             tr("Enter Pixmap Size:"),
                                             QLineEdit::Normal,
                                             tr("%1 x %2").arg(glWidget->width())
                                                          .arg(glWidget->height()),
                                             &ok);
        if (!ok)
            return QSize();
    
        QRegExp regExp(tr("([0-9]+) *x *([0-9]+)"));
        if (regExp.exactMatch(text)) {
            int width = regExp.cap(1).toInt();
            int height = regExp.cap(2).toInt();
            if (width > 0 && width < 2048 && height > 0 && height < 2048)
                 return QSize(width, height);
        }
        return glWidget->size();
    }
    
    void MainWindow::renderIntoPixmap()
    {
        QSize size = getSize();
        if (size.isValid()) {
            QPixmap pixmap = glWidget->renderPixmap(size.width(), size.height());
            setPixmap(pixmap);
        }
    }
    
    void MainWindow::grabFrameBuffer()
    {
        //QGLWidget有一个返回其帧缓冲区的QImage图片的函数
        QImage image = glWidget->grabFrameBuffer();
        //QPixmap的fromImage函数把一个QImage转换成QPixmap
        setPixmap(QPixmap::fromImage(image));
    }
    
    void MainWindow::clearPixmap()
    {
        setPixmap(QPixmap()); //给它传一个空的对象
    }
    
    void MainWindow::about()
    {
        QMessageBox::about(this, tr("About Grabber"),
                 tr("The <b>Grabber</b> example demonstrates two approaches for "
                    "rendering OpenGL into a Qt pixmap."));
    }
    
    QSlider *MainWindow::createSlider(const char *changedSignal,
                                      const char *setterSlot)
    {
        QSlider *slider = new QSlider(Qt::Horizontal);
        slider->setRange(0, 16 * 360);
        slider->setSingleStep(16);
        slider->setPageStep(15 * 16);
        slider->setTickInterval(15 * 16);
        slider->setTickPosition(QSlider::TicksRight);
    
        //这种经典的用法一定要小心,报错:glWidget的槽函数在传进来的时候已经被强制转换成SLOT了,
        //所以setterSlot不用SLOT修饰;同样,changedSignal也不能再拿SIGNAL修饰
        connect(slider, SIGNAL(valueChanged(int)), glWidget, setterSlot);
        connect(glWidget, changedSignal, slider, SLOT(setValue(int)));
    
        return slider;
    }
    
    void MainWindow::createActions()
    {
        renderIntoPixmapAction = new QAction(tr("&Render into Pixmap..."), this);
        renderIntoPixmapAction->setShortcut(tr("Ctrl+R"));
        renderIntoPixmapAction->setToolTip(tr("yes, triggerd it"));
        connect(renderIntoPixmapAction, SIGNAL(triggered()),
                this, SLOT(renderIntoPixmap()));
    
        grabFrameBufferAction = new QAction(tr("&Grab Frame Buffer"), this);
        grabFrameBufferAction->setShortcut(tr("Ctrl+G"));
        connect(grabFrameBufferAction, SIGNAL(triggered()),
                this, SLOT(grabFrameBuffer()));
    
        clearPixmapAction = new QAction(tr("&Clear Pixmap"), this);
        clearPixmapAction->setShortcut(tr("Ctrl+L"));
        connect(clearPixmapAction, SIGNAL(triggered()), this, SLOT(clearPixmap()));
    
        exitAction = new QAction(tr("E&xit"), this);
        exitAction->setShortcuts(QKeySequence::Quit);
        connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
    
        aboutAction = new QAction(tr("&About"), this);
        connect(aboutAction, SIGNAL(triggered()), this, SLOT(about()));
    
        aboutQtAction = new QAction(tr("About &Qt"), this);
        connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
    }
    
    void MainWindow::createMenus()
    {
        fileMenu = menuBar()->addMenu(tr("&File"));
        fileMenu->addAction(renderIntoPixmapAction);
        fileMenu->addAction(grabFrameBufferAction);
        fileMenu->addAction(clearPixmapAction);
        fileMenu->addSeparator();
        fileMenu->addAction(exitAction);
    
        helpMenu = menuBar()->addMenu(tr("&Help"));
        helpMenu->addAction(aboutAction);
        helpMenu->addAction(aboutQtAction);
    }
    
    MainWindow::~MainWindow()
    { 
    }
    

     

            GLWidget类是整个绘图的部分,在这部分虽然用了一点Qt的东西,但我们不是非要这样使用,我们可以用整个纯净的OpengGL库来完成我们的绘制。

    //glwidget.h
    #ifndef GLWIDGET_H
    #define GLWIDGET_H
    
    #include <QGLWidget>
    
    class GLWidget : public QGLWidget
    {
        Q_OBJECT
    
    public:
        explicit GLWidget(QWidget *parent = 0);
    
        int xRotation() const { return xRot; }
        int yRotation() const { return yRot; }
        int zRotation() const { return zRot; }
    
    signals:
        void xRotationChanged(int angle);
        void yRotationChanged(int angle);
        void zRotationChanged(int angle);
        
    public slots:
        void setXRotation(int angle);
        void setYRotation(int angle);
        void setZRotation(int angle);
    
    protected:
        void initializeGL();
        void paintGL();
        void resizeGL(int w, int h);
        void mousePressEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
    
    private slots:
        void alwaysRotate();
        void drawTriangle();
    
    private:
        void normalizeAngle(int *angle);
    
        int xRot;
        int yRot;
        int zRot;
    
        QColor faceColors[4];
        QPoint lastPos;
    };
    
    #endif // GLWIDGET_H
    

            以下是代码实现部分:

    //glwidget.cpp
    #include <QtGui>
    #include <QtOpenGL>
    
    #include <math.h>
    
    #include "glwidget.h"
    
    GLWidget::GLWidget(QWidget *parent) :
        QGLWidget(parent)
    {
        xRot = 0;
        yRot = 0;
        zRot = 0;
    
        faceColors[0] = Qt::red;
        faceColors[1] = Qt::green;
        faceColors[2] = Qt::blue;
        faceColors[3] = Qt::yellow;
    
        QTimer *timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(alwaysRotate()));
        timer->start(70);
    }
    
    void GLWidget::initializeGL()
    {
        glClearColor(0.0, 0.2, 0.3, 1.0);
        glShadeModel(GL_SMOOTH);
        glEnable(GL_DEPTH);
    }
    
    void GLWidget::paintGL()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glPushMatrix();
        drawTriangle();
        glPopMatrix();
    }
    
    void GLWidget::resizeGL(int w, int h)
    {
        int side = qMin(w, h);
        glViewport((width() - side) / 2, (height() - side) / 2, side, side);
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-1.2, 1.2, -1.2, 1.2, 5.0, 60.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.0, 0.0, -40.0);
    }
    
    void GLWidget::mousePressEvent(QMouseEvent *event)
    {
        lastPos = event->pos();
    }
    
    void GLWidget::mouseMoveEvent(QMouseEvent *event)
    {
        int dx = event->x() - lastPos.x();
        int dy = event->y() - lastPos.y();
    
        if (event->buttons() & Qt::LeftButton) {
            (xRot + 4 * dx);
            setYRotation(yRot + 4 * dy);
        } else if (event->buttons() & Qt::RightButton) {
            (xRot + 4 * dy);
            setZRotation(zRot + 4 * dx);
        }
    
        lastPos = event->pos();
    }
    
    void GLWidget::drawTriangle()
    {
        static const GLfloat P1[3] = { 0.0, -1.0, +2.0 };
        static const GLfloat P2[3] = { +1.73205081, -1.0, -1.0 };
        static const GLfloat P3[3] = { -1.73205081, -1.0, -1.0 };
        static const GLfloat P4[3] = { 0.0, +2.0, 0.0 };
    
        static const GLfloat * const coords[4][3] = {
            { P1, P2, P3 }, { P1, P3, P4 }, { P1, P4, P2 }, { P2, P4, P3 }
        };
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.0, 0.0, -10.0);
        glRotatef(xRot, 1.0, 0.0, 0.0);
        glRotatef(yRot, 0.0, 1.0, 0.0);
        glRotatef(zRot, 0.0, 0.0, 1.0);
    
        for (int i = 0; i != 4; ++i) {
            //glLoadName(i);
            glBegin(GL_TRIANGLES);
            qglColor(faceColors[i]);
            for (int j = 0; j < 3; ++j) {
                glVertex3f(coords[i][j][0], coords[i][j][1],
                           coords[i][j][2]);
            }
            glEnd();
        }
    }
    
    void GLWidget::normalizeAngle(int *angle)
    {
        while (*angle < 0)
            angle += 360 * 16;
        while (*angle > 360 *16)
            angle -= 360 *16;
    }
    
    void GLWidget::setXRotation(int angle)
    {
        normalizeAngle(&angle);
        if ( angle != xRot ) {
            xRot = angle;
            emit xRotationChanged(angle);
            updateGL();
        }
    }
    
    void GLWidget::setYRotation(int angle)
    {
        normalizeAngle(&angle);
        if ( angle != yRot ) {
            yRot = angle;
            emit yRotationChanged(angle);
            updateGL();
        }
    }
    
    void GLWidget::setZRotation(int angle)
    {
        normalizeAngle(&angle);
        if ( angle != zRot ) {
            zRot = angle;
            emit zRotationChanged(angle);
            updateGL();
        }
    }
    
    void GLWidget::alwaysRotate()
    {
        zRot += 2;
        emit zRotationChanged(zRot);
        updateGL();
    }


     

             至此,我们就完成了整个应用程序的编写,继续努力。

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • OpenGL的绘图描述表,定义显示列表,以及执行其他的初始化 void Tetrahedron::initializeGL() { qglClearColor(Qt::black); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); } // ...
  • Qt应用程序可以应用QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库。Qt OpenGL模块供给QGLWidget类,可以通过对它子类化,并应用OpenGL命令开发出自己的窗口部件。对许多三维应用程序来讲,这就足...
  • 三维绘图之OpenGL和Qt的结合

    千次阅读 2017-03-13 15:47:25
    Qt应用程序可以使用QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库。Qt OpenGL模块提供QGLWidget类,可以通过对它子类化,并使用OpenGL命令开发出自己的窗口部件。对许多三维应用程序来说,这就足够了。  ...
  • 第13章 PyQtDataVisualization三维绘图 Data Visualization是Qt中的一个三维数据可视化模块,可以绘制三维柱状图、三维散点图、三维曲面等。Data Visualization模块的功能虽然不能和一些专业的三维图形类库(如VTK...
  • 1、新建QT GUI项目,基类...
  • Qt绘图绘图设备

    2020-07-12 17:41:10
    Qt绘图系统允许使用相同的API在屏幕和其他打印设备上进行绘制,整个绘图系统基于QPainter,QPainterDevice,QPaintEngine个类。 QPainter用来执行绘制的操作 QPainterDevice是一个二空间的抽象,这个二空间...
  • QT绘图绘图设备

    2018-05-22 10:11:13
    Qt绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine个类。QPainter用来执行绘制的操作;QPaintDevice是一个二空间的抽象,这个二空间...
  • Qt绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine个类。 QPainter用来执行绘制的操作;QPaintDevice是一个二空间的抽象,这个二...
  • Qt 5——绘图绘图设备

    千次阅读 2020-06-19 21:43:04
    Qt绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine个类。 QPainter用来执行绘制的操作; QPaintDevice是一个二空间的抽象,这个二...
  • Qt绘图系统允许使用现同的API在屏幕和其他打印设备上进行绘制。整个绘图系统基于 QPainter、QPaintDevice、QPaintEngine 个类。 QPainter 用来执行绘制的操作。 QPaintDevice 是一个二空间的抽象,这个二...
  • Qt绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine个类。 QPainter用来执行绘制的操作;QPaintDevice是一个二空间的抽象,这个二...
  • qt5绘图绘图设备

    2021-01-26 23:26:26
    Qt绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine个类。 QPainter用来执行绘制的操作;QPaintDevice是一个二空间的抽象,这个二...
  • Qt绘图

    2016-01-24 22:14:03
    Qt绘图系统允许使用相同的API在屏幕和其他打印设备上进行绘制。整个绘图系统基于QPainter,QPaintDevice和QPaintEngine个类。QPainter用来执行绘制操作;QPaintDevice是一个二空间抽象,这个二空间允许...
  • Qt中提供了强大的2D绘图系统,可以使用同一API实现在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice和QPaintEngine这个类。其中QPainter用来执行绘图操作;QPaintDevice提供绘图设备,它是一个二...
  • Qt 简单绘图

    2020-03-20 15:34:07
    整个绘图系统基于QPainter,QPainterDevice和QPaintEngine个类。 QPainter用来执行绘制的操作;QPaintDevice是一个二空间的抽象,这个二空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;...
  •   Qt绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine个类。   QPainter用来执行绘制的操作;QPaintDevice是一个二空间的抽象,这...

空空如也

空空如也

1 2 3 4 5
收藏数 99
精华内容 39
关键字:

qt三维绘图