如何正确调用此CGAL的QT界面功能?

时间:2016-04-04 19:36:58

标签: c++ qt cgal

我的环境是Ubuntu 14.04上的CGAL 4.5和QT5。

我正在学习如何使用CGAL的Qt interface渲染几何对象,如点,线,段。似乎没有在网上使用这个框架的例子,所以我现在正在努力。

我似乎无法让我的测试代码工作。它编译但会抛出一个段错误。

以下是我通过QtCreator创建的QTwidgets应用程序中MainWindow.cpp文件的代码。

#include <iostream>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Qt/PointsGraphicsItem.h>
#include <CGAL/Qt/SegmentsGraphicsItem.h>
#include <vector>

typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    std::vector<Point_2> pts;

    pts.push_back(Point_2(1,1));
    pts.push_back(Point_2(10,10));

    CGAL::Qt::PointsGraphicsItem< std::vector<Point_2> > graphical_points(&pts);

} 

最后一行似乎是问题。我的代码不断抛出段错误 在此刻。消息是

The inferior stopped because it received a signal from the operating system.

Signal name :    SIGSEGV
Signal meaning : Segmentation fault

我在这个函数调用中做错了什么?我知道我必须将这些点添加到图形场景中,但这一点并不重要。

理想情况下,当代码运行时,它应该显示两个点,一个在(1,1),另一个在(10,10),一旦我将这些点添加到场景中。

Here是Pastebin上完整PointsGraphicsItem.h文件的链接。

3 个答案:

答案 0 :(得分:0)

您应该使用新的点向量创建图形项,然后调用scene.addItem(..)。使用点填充矢量时,在将其连接到PointsGraphicsItem::modelChanged()

后发出信号

如果我是你,我会采用现有的演示,例如Polygon_2演示 并且一点一点地修改它。

请注意,演示不是我们付出努力的地方,因为CGAL主要是关于几何数据结构和算法。

答案 1 :(得分:0)

好吧,现在我看到你的代码问题出在哪里了。向量pts的生命周期只是构造函数MainWindow::MainWindow(..)。 当PointsGraphicsItem的绘制方法试图绘制这些点时,它们就不再存在了。

答案 2 :(得分:0)

CGAL::Qt::PointsGraphicsItem< std::vector<Point_2> > graphical_points(&pts);

在上面一行中,您传递的是局部变量pts的地址。这是不允许的。另外,不要忘记在.pro项目文件中设置以下标志。

LIBS += -lCGAL -lgmp
QMAKE_CXXFLAGS += -frounding-math