【问题标题】:C++ Qt in ubuntu Segmentation fault when trying to new object Qchart尝试新对象Qchart时,ubuntu中的C ++ Qt分段错误
【发布时间】:2020-04-08 10:10:37
【问题描述】:

我正在尝试在 ubuntu 中使用 Qchart。运行以下代码时出现分段错误(sigsegv)错误。创建Qchart对象时出现此错误。

头文件:

#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
using namespace QtCharts;
class Test
{
  public:
    Test();
    ~Test();
    void Run();
  private:
    QLineSeries *series;
    QChart *chart;
    QChartView *chartView;
};

cpp 文件:

#include "test.h"
Test::Test()
{        
  series = new QLineSeries();
  chart = new QChart();
  chartView = new QChartView(chart);
}

void Test::Run(){
  series->append(0, 6);
  series->append(2, 4);
  series->append(3, 8);
  series->append(7, 4);
  series->append(10, 5);
  chart->legend();
  chart->addSeries(series);
  chart->createDefaultAxes();
  chart->setTitle("Simple line chart example");
  chartView->setRenderHint(QPainter::Antialiasing);
  chartView->show();
}
Test::~Test(){
  delete series;
  delete chart;
  delete chartView;
}

有什么问题?以及如何解决这个错误?

【问题讨论】:

  • 请提供minimal reproducible example,说明您如何使用显示的代码,并提供有关似乎导致段错误的行的一些信息。需要注意的一点是,当使用chartView = new QChartView(chart) 时,chartView 拥有chart 的所有权。这意味着delete chart 后跟delete chartView 将触发双重删除,因此会触发未定义的行为。
  • 在运行Test::run() 之前是否初始化了QGuiApplication?如果你不这样做,你会得到这个段错误。如果你这样做了,你会得到另一个,我想一些小部件需要先设置或其他东西..
  • @G.M.感谢您对最小可重复性的提示。但我不明白你的笔记。你能解释一下吗?
  • 什么通用汽车。就是说你的析构函数有错误。 QChartView 拥有其QChart 的所有权(图形视图/场景除外),因此您不应删除图表。但是,您的段错误已经发生在构造函数中。
  • @ypnos,谢谢。你是对的,我的段错误发生在构造函数中。另外,我在“Test::run()”之前使用了“QGuiApplication”,但没有解决。

标签: c++ qt segmentation-fault qchart


【解决方案1】:

我不知道你是否还需要这方面的帮助,但如果有人需要,我会分享我的解决方案。

首先,您需要确保QApplication 已声明并正常工作(不要与QGuiApplication 混淆)。

其次,如果你必须要模块化图表(就像你通过定义Test类并在其中定义图表属性),你需要初始化QChart(或包含在主窗口小部件的构造函数中初始化QChart)。在 Windows 中,这种方法可以解决您的问题:

在 mainwindow.h 中:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
   Test testObject;
   //other stuff
}

在 mainwindow.cpp 中

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow)
{

    testObject = Test();
    //other stuff
}

注意 MainWindow 是 Windows 中默认的 QMainWindow 小部件类。

我不确定,但问题的根源可能是 qchart.h 文件中的 Q_DISABLE_COPY(QChart) 行。它需要抛出编译时错误,而是在运行时导致分段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多