我需要在 Qt 中绘制图表。用户拥有创建和删除顶点(点)和边(线)的能力。用户也可以用鼠标移动顶点。
Qwt可以帮助我还是我应该使用其他东西(例如使用 QWidget + QPainter 自己绘制)
PS 可能存在未连接的顶点。
我找到了 Qt 示例 - Eastic Nodes。经过一些工作,我做了我想要的。
更新:如果有人感兴趣,这是我的代码。
使用 QGLWidget 结合 QStack 来保存顶点、实体类型及其信息(颜色、线宽)。
你重载 QGLWidgets 虚函数 initializeGL , resizeGL 和 paintGL
这是一个例子:
#ifndef DDEVICE_H
#define DDEVICE_H
#include <QtOpenGL/QGLWidget>
#include "Renderer.h"
class dDevice : public QGLWidget
{
Q_OBJECT
public:
explicit dDevice(QWidget *parent = 0);
protected:
void initializeGL(){ Renderer::Engine()->init(); }
void resizeGL(int w, int h){ Renderer::Engine()->resize(w,h);}
void paintGL(){ Renderer::Engine()->draw(); }
};
#endif // DDEVICE_H
和渲染器单例。
#ifndef RENDERER_H
#define RENDERER_H
#include <QtOpenGL/QtOpenGL>
#include "Types.h"
class Renderer : public EStack
{
int width,height,aspect_ratio;
public:
static Renderer* Engine();
bool init();
bool resize(int W,int H);
bool draw();
private:
Renderer():EStack(){ }
static Renderer* m_pInstance;
};
#endif // RENDERER_H
EStack 是实体堆栈,一个包含 QStacks 的线、贝塞尔曲线、圆弧、圆盘、圆和折线的类。哪些是包含顶点、颜色、线宽结构的实体结构。
绘制带有四个控制点和 #defined REGEN 量常数通常高于 36 的 Bezier 曲线。在 Renderer::draw 中添加它。reziseGL 也调用paintGL。
Entities::Bezier temp = bcurves().at(i);
glLineWidth(temp.LW.value); // change LWidth
glColor3f( temp.CL.R, temp.CL.G, temp.CL.B );
double A[] = { temp.cPoints.points[0].X , temp.cPoints.points[0].Y };
double B[] = { temp.cPoints.points[1].X , temp.cPoints.points[1].Y };
double C[] = { temp.cPoints.points[2].X , temp.cPoints.points[2].Y };
double D[] = { temp.cPoints.points[3].X , temp.cPoints.points[3].Y };
glBegin(GL_LINE_STRIP);
double a = 1.0;
for(int ii=0;ii<=WW_BEZIER_ACCURACY;ii++){
double b = 1.0-a;
double X = A[0]*a*a*a + B[0]*3*a*a*b + C[0]*3*a*b*b + D[0]*b*b*b;
double Y = A[1]*a*a*a + B[1]*3*a*a*b + C[1]*3*a*b*b + D[1]*b*b*b;
glVertex2d(X,Y);
a = a - 1.0/WW_BEZIER_ACCURACY;
}
glEnd();
或使用其实体结构的简单线条。
Entities::Line temp = lines().at(i);
glLineWidth(temp.LW.value); // change LWidth
glBegin(GL_LINE_STRIP);
glColor3f(temp.CL.R,temp.CL.G,temp.CL.B);
glVertex2d(temp.A.X,temp.A.Y);
glVertex2d(temp.B.X,temp.B.Y);
glEnd();
glLineWidth(WW_DEFAULT_LWIDTH); // reset LWidth
这也绘制了一条线带。
glBegin(GL_LINE_STRIP);
glVertex2d(0,0);
glVertex2d(.5,.5);
glEnd();
Qwt 可用于执行此操作。查看 Qwt 包的示例目录中的 event_filter 示例。该示例不允许添加和删除顶点,但添加它应该不会太难。
我会推荐 Qwt,因为它提供了许多您需要的基本绘图功能并且非常可扩展,因此您可以轻松添加新功能。