Qtでグラフを描く必要があります。ユーザーは、頂点 (ドット) とエッジ (線) を作成および削除する機能を持っている必要があります。また、ユーザーはマウスで頂点を移動できます。
Qwtはそれを手伝ってくれますか、それとも何か他のものを使うべきですか(たとえば、QWidget + QPainterで自分で描いてください)
PS接続されていない頂点がある可能性があります。
Qt の例を見つけました - Eastic Nodes。そして、それでいくつかの作業を行った後、私は自分が欲しかったものを作りました。
更新:誰かが興味を持っている場合、これが私のコードです。
QGLWidget を QStack と組み合わせて使用して、頂点、エンティティ タイプ、およびそれらの情報 (Color、LineWidth) を保持します。
QGLWidget 仮想関数 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
そしてRendererシングルトン。
#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 は Entities スタックであり、線、ベジェ曲線、円弧、円盤、円、およびポリラインの QStack を含むクラスです。頂点、色、線幅の構造体を含むエンティティ構造体です。
4 つの制御点と、通常は 36 を超える #defined REGEN 量定数を使用してベジエ曲線を描画します。これを 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 は、必要な多くの基本プロット機能を提供し、非常に拡張可能であるため、新しい機能を簡単に追加できるため、Qwt をお勧めします。