0

Qtについて質問です。作成したすべてのポインターをどのように削除する必要があるのか​​ 疑問に思っています。例えば:

.h ファイル

#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

.cpp ファイル:

#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();
    }
}

私はここで立ち往生しています。すべてのポインター (QPushbutton など) とサブクラスを削除して、メモリ リークが発生しないようにする必要がありますか?

4

2 に答える 2

1

簡単な回答: いいえ、明示的に削除する必要はありません。

Qt では、QObjects はオブジェクト ツリーで編成されます。さまざまなウィジェットの親子関係は、親が子ウィジェットの所有権を取得することも意味します。

その結果、アプリケーションの終了時にそれらを明示的に削除する必要はありません。各親は、自分の子供のクリーンアップを担当します。親を持たないウィジェット/オブジェクト (へのポインター) を作成する場合にのみ、明示的に削除する必要があります。

于 2012-08-19T20:04:55.623 に答える
0

これらとウィジェットの間addWidgetに親子関係を作成します。親のないウィジェットは手動で破棄する必要があり、その結果、その子が再帰的に解放されます。ウィジェットに親があり、それが手動で解放されるか、別のウィジェットの子である限り、手動で解放する必要はありません。

QObject 派生クラスの同じアカウント。

于 2012-08-19T20:07:31.700 に答える