菜鸟三岁 2022-08-03 22:55 采纳率: 0%
浏览 104

QT 构造函数 局部指针 析构

在一个类的构造函数中,建立一个局部指针,为甚么不会析构.如果说构造函数就是用来初始化的,这个回答我觉得有些牵强.

代码
//构造函数
ChartDisplay::ChartDisplay(QWidget *parent)
: QMainWindow(parent)
, ipLineEdit(new QLineEdit(QLatin1String("127.0.0.1"),this))
, portLineEdit(new QLineEdit(tr("10003"),this))
, ipLabel(new QLabel(tr("Server &ip:"),this))
, portLabel(new QLabel(tr("Server &port:"),this))
, statusLabel(new QLabel(tr("This examples requires that you run the Fortune Server example as well."),this))
, serverConnectButton(new QPushButton(tr("Get connect"),this))
, tcpSocket(new QTcpSocket(this))
, currentDataStr(QString())
{
initFunc();
connectFunc();
}

ChartDisplay::~ChartDisplay()
{
}

void ChartDisplay::initFunc()
{
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
//setWindowFlags(Qt::Dialog);
portLineEdit->setValidator(new QIntValidator(1, 65535, this));
ipLabel->setBuddy(ipLineEdit);
portLabel->setBuddy(portLineEdit);
serverConnectButton->setDefault(true);
serverConnectButton->setEnabled(1);
auto quitButton = new QPushButton(tr("Quit"));
auto buttonBox = new QDialogButtonBox;
buttonBox->addButton(serverConnectButton, QDialogButtonBox::ActionRole);
buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
connect(quitButton, &QAbstractButton::clicked, this, &QWidget::close);

// in.setDevice(tcpSocket);
// in.setVersion(QDataStream::Qt_4_0);

setWindowTitle(QGuiApplication::applicationDisplayName());
portLineEdit->setFocus();

//auto centerVBoxLayout = new QVBoxLayout(this);
auto chartWidget = new QWidget(this);

// auto anotherWidget = new QWidget(this);
auto gridLayout = new QGridLayout(chartWidget);
mychart *chart = new mychart(0,0,5,"时间","经度");
chart->setTitle("Dynamic 经度 chart");
chart->legend()->hide();
chart->setAnimationOptions(QChart::AllAnimations);
QChartView chartView(chart,chartWidget);
chartView.setRenderHint(QPainter::Antialiasing);

gridLayout->addWidget(&chartView,0,0,20,6,Qt::AlignCenter);
gridLayout->addWidget(ipLabel,1,0,1,1,Qt::AlignLeft);
gridLayout->addWidget(ipLineEdit,1,1,1,1,Qt::AlignLeft);
gridLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored),1,2,1,3,Qt::AlignLeft);
gridLayout->addWidget(serverConnectButton,1,5,1,1,Qt::AlignRight);
gridLayout->addWidget(portLabel,2,0,1,1,Qt::AlignLeft);
gridLayout->addWidget(portLineEdit,2,1,1,1,Qt::AlignLeft);
gridLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored),2,2,1,3,Qt::AlignLeft);
gridLayout->addWidget(quitButton,2,5,1,1,Qt::AlignRight);
gridLayout->addWidget(statusLabel,3,0,1,6,Qt::AlignLeft);
chartWidget->setLayout(gridLayout);
gridLayout->setRowStretch(0,10);
gridLayout->setRowStretch(1,1);
gridLayout->setRowStretch(2,1);
gridLayout->setRowStretch(3,1);
setCentralWidget(chartWidget);

}
这段代码中 auto quitButton = new QPushButton(tr("Quit"));没有被析构, 我自己写的 mychart *chart = new mychart(0,0,5,"时间","经度");被析构了.为什么,是因为我自己的类构造函数没有父类指针吗

mychart::mychart(qreal xmin, qreal ymin, qint8 tickcount, QString xtitle, QString ytitle)
:mxmin(xmin),
mymin(ymin),
mtickcount(tickcount),
mxtitle(xtitle),
mytitle(ytitle),
myAxis(new QValueAxis()),
msplineSeriesData(new QSplineSeries()),
mxDateAxis(new QDateTimeAxis())
{
QPen green(Qt::green);
green.setWidth(3);
msplineSeriesData->setPen(green);
msplineSeriesData->append(QDateTime(QDate(2022,6,10),QTime(14,20,32)).toMSecsSinceEpoch(),1);
msplineSeriesData->append(QDateTime(QDate(2022,6,10),QTime(14,20,34)).toMSecsSinceEpoch(),1);
msplineSeriesData->append(QDateTime(QDate(2022,6,10),QTime(14,20,36)).toMSecsSinceEpoch(),1);
msplineSeriesData->append(QDateTime(QDate(2022,6,10),QTime(14,20,38)).toMSecsSinceEpoch(),1);
addSeries(msplineSeriesData);

addAxis(mxDateAxis,Qt::AlignBottom);
addAxis(myAxis,Qt::AlignLeft);
bool ol = msplineSeriesData->attachAxis(mxDateAxis);
ol = msplineSeriesData->attachAxis(myAxis);
mxDateAxis->setTickCount(mtickcount);
mxDateAxis->setRange(QDateTime(QDate(2022,6,10),QTime(14,20,30)),QDateTime(QDate(2022,6,10),QTime(14,20,40)));
myAxis->setRange(mymin, 10);
mxDateAxis->setTitleText(mxtitle);
myAxis->setTitleText(mytitle);

//mxDateAxis->setFormat("yyyy-MM-dd hh-mm-ss-z");
//已经被弃用
//this->setAxisX(mxDateAxis,msplineSeriesData);

}

  • 写回答

3条回答 默认 最新

  • yun6853992 2022-08-04 09:01
    关注

    这里你的理解是不是进入误区了。
    首先,你的指针对象是new出来的,就属于是堆上申请了内存,堆上申请的内存,一般要程序员自己进行释放的。

    除此之外,个人理解,qt毕竟涉及了图形界面,很多内存的申请以及释放,其实嵌入在了图形界面设计中了,(为了维持图形界面的显示,以及关闭时相关堆内存的释放)

    评论

报告相同问题?

问题事件

  • 创建了问题 8月3日

悬赏问题

  • ¥15 在不同的执行界面调用同一个页面
  • ¥20 基于51单片机的数字频率计
  • ¥50 M3T长焦相机如何标定以及正射影像拼接问题
  • ¥15 keepalived的虚拟VIP地址 ping -s 发包测试,只能通过1472字节以下的数据包(相关搜索:静态路由)
  • ¥20 关于#stm32#的问题:STM32串口发送问题,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0
  • ¥15 C++map释放不掉
  • ¥15 Mabatis查询数据
  • ¥15 想知道lingo目标函数中求和公式上标是变量情况如何求解
  • ¥15 关于E22-400T22S的LORA模块的通信问题
  • ¥15 求用二阶有源低通滤波将3khz方波转为正弦波的电路