【问题标题】:PCL addLine in Qt crashes applicationQt 中的 PCL addLine 崩溃应用程序
【发布时间】:2017-04-13 15:26:38
【问题描述】:

我正在 Qt 中构建一个 PCL 查看器,并成功复制了在 PCL 站点 (http://pointclouds.org/documentation/tutorials/qt_visualizer.php) 上找到的演示应用程序

我构建了 vtk 5.8 来生成 qvtkWidget。

演示构建并运行良好,所有控件都正常工作并且点绘制正确。现在我需要绘制其他项目、球体、线条等。

我使用 viewer->addLine() 函数...在 Visual Studio 中它工作正常。 然而,在 Qt (4.8.5) 中,每当我尝试做任何其他事情时,它都会杀死程序!

QT 中的应用程序输出窗口报告以下内容

正在启动 C:\xxx\build\release\pcltest.exe... 程序意外结束。 C:\xxx\build\release\pcltest.exe 崩溃

似乎起作用的唯一功能是

addPointCloud()
removePointCloud()

以下所有导致它崩溃

setBackgroundColor()
addCoordinateSystem()
addLine()
addSphere()

有什么想法吗...?

【问题讨论】:

  • “在 Visual Studio 中”和“在 Qt 中”有什么区别?代码不一样吗?

标签: c++ qt point-cloud-library


【解决方案1】:

从Qt可视化教程代码开始;

在 UI 中添加一个新按钮 (pushButton_sphere),然后将信号连接到新的成员函数:

connect (ui->pushButton_sphere,  SIGNAL (clicked ()), this, SLOT (sphereButtonPressed ()));

成员函数应如下所示:

void
PCLViewer::sphereButtonPressed ()
{
  printf ("Sphere button was pressed\n");
  viewer->addSphere(pcl::PointXYZ(0, 0, 0), 1.0);
  viewer->addLine(pcl::PointXYZ(2, 0, 0), pcl::PointXYZ(1, 1, 1));
  viewer->addCube(Eigen::Vector3f(2, 0, 0), Eigen::Quaternionf::Identity(), 1, 1, 1);
  viewer->setBackgroundColor(.2, 0, 0);
  ui->qvtkWidget->update();
}

我在 Ubuntu 14.04 + PCL 1.7.2(来自 PPA)+ VTK 5.8 上测试了线条、球体、立方体和背景颜色。如果该代码崩溃,则可能是特定于平台的,因此请调试并fill a bug on the PCL tracker

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。

    从我目前所做的实验来看,如果您在创建 PCLVisualizer 后立即尝试添加多个元素,那么应用程序将崩溃。

    在示例应用程序中,仅在用户按下按钮后才会添加附加元素。这意味着在创建和添加元素之间存在时间延迟,而且 Qt 应用程序也有能力处理事件队列中的其他事件。

    我还没有深入了解这一点,但我的猜测是,在创建可视化器后调用 update() 会导致某些事件被放置在事件队列中。在处理这些内容之前尝试添加更多内容会导致崩溃。

    问题出在我的代码中,我需要立即开始添加内容,但我没有机制来确定何时可以安全添加。

    【讨论】:

      【解决方案3】:

      确保 VTK 安装路径已放入您的全局环境中。由于QT找不到它,它可能会崩溃。

      【讨论】:

        猜你喜欢
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多