为什么Qt图表示例不删除动态分配的变量

Why Qt chart example does not delete dynamically allocated variables

本文关键字:删除 动态分配 变量 Qt 表示 为什么      更新时间:2023-10-16

我一直在检查Qt条形图示例,我注意到动态分配的变量根本没有被删除,为什么?我尝试复制这个示例的想法,然后在布局中使用,并在plainTextEditor中显示图表。然而,我想删除这些动态分配的变量,一旦我显示图表,但我不知道何时何地删除它们。我试图在函数结束时删除它们,但它不会在plainTextEditor上显示任何内容。我不想把这些动态分配的变量定义为成员变量,然后在析构函数中删除它们。

这里是我从Qt文档

得到的例子
> #include <QtWidgets/QApplication>
> #include <QtWidgets/QMainWindow>
> #include <QtCharts/QChartView>
> #include <QtCharts/QBarSeries>
> #include <QtCharts/QBarSet>
> #include <QtCharts/QLegend>
> #include <QtCharts/QBarCategoryAxis>
> 
> QT_CHARTS_USE_NAMESPACE
> 
> int main(int argc, char *argv[]) {
>     QApplication a(argc, argv);
> 
>     QBarSet *set0 = new QBarSet("Jane");
>     QBarSet *set1 = new QBarSet("John");
>     QBarSet *set2 = new QBarSet("Axel");
>     QBarSet *set3 = new QBarSet("Mary");
>     QBarSet *set4 = new QBarSet("Samantha");
> 
>     *set0 << 1 << 2 << 3 << 4 << 5 << 6;
>     *set1 << 5 << 0 << 0 << 4 << 0 << 7;
>     *set2 << 3 << 5 << 8 << 13 << 8 << 5;
>     *set3 << 5 << 6 << 7 << 3 << 4 << 5;
>     *set4 << 9 << 7 << 5 << 3 << 1 << 2;
> 
>     QBarSeries *series = new QBarSeries();
>     series->append(set0);
>     series->append(set1);
>     series->append(set2);
>     series->append(set3);
>     series->append(set4);
> 
> 
>     QChart *chart = new QChart();
>     chart->addSeries(series);
>     chart->setTitle("Simple barchart example");
>     chart->setAnimationOptions(QChart::SeriesAnimations);
> 
>     QStringList categories;
>     categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
>     QBarCategoryAxis *axis = new QBarCategoryAxis();
>     axis->append(categories);
>     chart->createDefaultAxes();
>     chart->setAxisX(axis, series);
> 
>     chart->legend()->setVisible(true);
>     chart->legend()->setAlignment(Qt::AlignBottom);
> 
>     QChartView *chartView = new QChartView(chart);
>     chartView->setRenderHint(QPainter::Antialiasing);
> 
>     QMainWindow window;
>     window.setCentralWidget(chartView);
>     window.resize(420, 300);
>     window.show();
> 
>     return a.exec(); }

在Qt中,某些函数被指定为所有权,形成父/子关系。当孩子被摧毁时,父母会删除他们。

在您展示的示例中,seriesset0set4的父级(从对series->append的调用开始)。chartaxisseries的父节点(来自chart->setAxisX)。chartViewchart的父类(从它的构造:QChartView *chartView = new QChartView(chart))。最后,windowchartView的父节点(来自window.setCentralWidget)。由于window不是指针,而是具有自动存储时间的实际QMainWindow对象,因此它将在作用域结束时被销毁,并带走其所有后代。