C++ 删除创建的Qt元素和子类
我有一个关于Qt的问题。我想知道我应该如何删除我创建的所有指针。例如: .h文件C++ 删除创建的Qt元素和子类,c++,qt,memory,delete-operator,C++,Qt,Memory,Delete Operator,我有一个关于Qt的问题。我想知道我应该如何删除我创建的所有指针。例如: .h文件 #ifndef MAINCALENDAR_H #define MAINCALENDAR_H #include<QWidget> #include <QMap> #include <QComboBox> #include <QCalendarWidget> #include <QRadioButton> #include <QString> #i
#ifndef MAINCALENDAR_H
#define MAINCALENDAR_H
#include<QWidget>
#include <QMap>
#include <QComboBox>
#include <QCalendarWidget>
#include <QRadioButton>
#include <QString>
#include <QtGui>
#include "selector.h"
#include <QInputDialog>
class mainCalendar : public QWidget
{
Q_OBJECT
public:
mainCalendar(QWidget * parent = 0);
~mainCalendar();
void showAppointments();
public slots:
void showLCFunc() {select->getTod()->getIntf()->getListClass().orderListChronologic(); printer * test = new printer; test->setList(TodFace->getList()); test->show();}
void showLPFunc() {select->getTod()->getIntf()->getListClass().orderListByPriority(); printer * test = new printer; test->setList(TodFace->getList()); test->show();}
void loadFile() {QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"", tr("M-Calendar Files (*.mca)"));}
void saveFile() {QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"", tr("M-Calendar Files (*.mca)"));qDebug() << fileName << endl;}
void intshow();
void updater() {if (!Interface->isHidden()) { app->setList(Interface->getList()); app->Beta_update(1,calendar->selectedDate()); }
else if (!TodFace->isHidden()) {tod->setList(TodFace->getList()); tod->Beta_update(1,calendar->selectedDate());} }
private:
QPushButton *showLC;
QPushButton *showLP;
QPushButton *searchButton;
QPushButton *updateButton;
QPushButton *saveButton;
QPushButton *loadButton;
QLabel *instructions;
QPushButton *backButton;
QPushButton *taskButton;
interface * Interface;
todFace * TodFace;
showTod * tod;
showApp * app;
QCalendarWidget *calendar;
QGridLayout *mainLayout;
Selector * select;
};
#endif // MAINCALENDAR_H
我被困在这里了。我应该删除所有指针(QPushbutton等)和子类,这样就不会发生内存泄漏吗?简短回答:不,不必显式删除它们 在Qt中,QoObject是。各种小部件的父子关系还意味着父部件拥有子部件的所有权
因此,您不必在应用程序完成时显式删除它们。每位家长将负责清理自己的孩子。只有在创建一个(指向)没有父对象的小部件/对象的指针时,才需要显式删除它 通过
addWidget
在这些小部件之间创建父子关系。
任何无父窗口小部件都必须手动销毁,从而递归释放其子部件。
只要您的小部件有一个父部件,并且是手动释放的,或者是另一个小部件的子部件,就不需要手动释放
QObject派生类的帐户相同。好吧,您不应该手动删除具有父级的小部件。(表单上所有可见的小部件都有一个父类)我的所有子类都声明为:class subclass:public QWidget,所以我不必删除它们中的任何一个?或者是变量?但是valgind显示了数以百万计的内存泄漏(对于所有类),只要从子类构造函数调用widhet的构造函数,一切都很好。对不起,这是胡说八道。您使用addwidget,它应该是trickI不知道valgrind向您报告了什么,但也许您可以使用最简单的示例(例如,使用您自己的小部件和单个按钮),并查看它是否报告了任何内容。如果我在函数中而不是构造函数中分配内存,会怎么样?应该删除吗?
#include "maincalendar.h"
mainCalendar::mainCalendar(QWidget *parent)
: QWidget(parent)
{
QHBoxLayout * footButtons = new QHBoxLayout;
showLC = new QPushButton(tr("'to-do' (chrono)"));
showLP = new QPushButton(tr("'to-do' (priority)"));
searchButton = new QPushButton(tr("&Search"));
saveButton = new QPushButton(tr("&Save calendar"));
loadButton = new QPushButton(tr("&Load Calendar"));
updateButton = new QPushButton(tr("Update"));
footButtons->addWidget(searchButton);
footButtons->addWidget(saveButton);
footButtons->addWidget(loadButton);
footButtons->addWidget(showLC);
footButtons->addWidget(showLP);
instructions = new QLabel(tr("To view or add data, double-click date in calendar"));
calendar = new QCalendarWidget;
calendar->setGridVisible(true);
calendar->setMinimumDate(QDate(2012, 1, 1));
calendar->setMaximumDate(QDate(2016,12,31));
backButton = new QPushButton(tr("&Back to calendar"));
select = new Selector(0,calendar,instructions,backButton, updateButton);
tod = select->getTod();
TodFace = tod->getIntf();
TodFace->hide();
TodFace->setCalendar(calendar);
tod->hide();
app = select->getApp();
Interface = app->getIntf();
Interface->hide();
Interface->setCalendar(calendar);
app->hide();
backButton->hide();
updateButton->hide();
connect(showLC,SIGNAL(clicked()),this,SLOT(showLCFunc()));
connect(showLP,SIGNAL(clicked()),this,SLOT(showLPFunc()));
connect(updateButton, SIGNAL(clicked()), this, SLOT(updater()));
connect(backButton, SIGNAL(clicked()), this, SLOT(intshow()));
connect(loadButton,SIGNAL(clicked()),this,SLOT(loadFile()));
connect(saveButton,SIGNAL(clicked()),this,SLOT(saveFile()));
connect(calendar, SIGNAL(activated(QDate)), this, SLOT(intshow()));
mainLayout = new QGridLayout;
this->setMinimumHeight(800);
this->setMinimumWidth(1000);
mainLayout->setColumnMinimumWidth(0,500);
mainLayout->addWidget(calendar,0,0);
mainLayout->addWidget(app,1,0);
mainLayout->addWidget(Interface,1,2);
mainLayout->addWidget(tod,1,0);
mainLayout->addWidget(TodFace,1,2);
mainLayout->addWidget(backButton,0,0,Qt::AlignTop);
mainLayout->addLayout(footButtons,2,0,Qt::AlignLeading);
mainLayout->addWidget(instructions,2,0,Qt::AlignTrailing);
mainLayout->addWidget(updateButton,2,2,Qt::AlignRight);
setLayout(mainLayout);
setWindowTitle(tr("M-Calendar"));
}
mainCalendar::~mainCalendar()
{
}
void mainCalendar::intshow()
{
if (Interface->isHidden()&&TodFace->isHidden())
{
select->setDate(calendar->selectedDate());
select->show();
Interface->setdate(calendar->selectedDate());
TodFace->setdate(calendar->selectedDate());
} else
{
backButton->hide();
updateButton->hide();
Interface->hide();
app->close();
TodFace->hide();
tod->close();
calendar->show();
instructions->show();
}
}