如何正确调用此CGAL的QT接口函数?

How to call this CGAL's QT interface function correctly?

本文关键字:QT 接口 函数 CGAL 何正确 调用      更新时间:2023-10-16

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

我正在学习如何使用CGAL的Qt接口来渲染几何对象,如点、线、段。网上似乎没有使用这个框架的例子,所以我现在很挣扎。

我似乎无法使我的测试代码正常工作。它进行编译,但抛出seg错误。

以下是通过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);
} 

最后一行似乎是问题行。我的代码不断抛出segfault此时。消息为

The inferior stopped because it received a signal from the operating system.
Signal name :    SIGSEGV
Signal meaning : Segmentation fault

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

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

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

您应该创建具有新点和空点向量的图形项,并调用scene.addItem(..)。当用点填充矢量时,在将其连接到PointsGraphicsItem::modelChanged() 后发出信号

如果我是你,我会做一个现有的演示,比如Polygon_2演示并一点一点地修改。

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

好吧,现在我明白你的代码的问题在哪里了。向量pts的生命周期只是构造函数MainWindow::MainWindow(..)。当PointsGraphicsItem的绘制方法尝试绘制这些点时,这些点已不存在。

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

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

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