2013-07-25 11 views
5

questo è un codice generato dal file qt ui, vedo che il codice usa la parola chiave new per allocare memoria ma non c'è la parola chiave delete nella classe per eliminare la risorsa assegnata, è questo errore da sviluppatori qt o c'è qualcos'altro (nessuna risorsa dealloccata)?Qt UI Generator non rilascia la risorsa

/******************************************************************************** 
** Form generated from reading UI file 'canyyeffectcontrol.ui' 
** 
** Created by: Qt User Interface Compiler version 5.0.2 
** 
** WARNING! All changes made in this file will be lost when recompiling UI file! 
********************************************************************************/ 

#ifndef UI_CANYYEFFECTCONTROL_H 
#define UI_CANYYEFFECTCONTROL_H 

#include <QtCore/QVariant> 
#include <QtWidgets/QAction> 
#include <QtWidgets/QApplication> 
#include <QtWidgets/QButtonGroup> 
#include <QtWidgets/QCheckBox> 
#include <QtWidgets/QGridLayout> 
#include <QtWidgets/QHeaderView> 
#include <QtWidgets/QLabel> 
#include <QtWidgets/QSlider> 
#include <QtWidgets/QSpinBox> 
#include <QtWidgets/QWidget> 

QT_BEGIN_NAMESPACE 

class Ui_canyyeffectcontrol 
{ 
public: 
    QGridLayout *gridLayout; 
    QSlider *Threshold2Slider; 
    QLabel *Threshold1Label; 
    QLabel *ApertureSizeLabel; 
    QLabel *Threshold2Label; 
    QSpinBox *Threshold1Spin; 
    QSpinBox *Threshold2Spin; 
    QSpinBox *ApertureSizeSpin; 
    QSlider *ApertureSizeSlider; 
    QSlider *Threshold1Slider; 
    QCheckBox *EL2GLabel; 

    void setupUi(QWidget *canyyeffectcontrol) 
    { 
     if (canyyeffectcontrol->objectName().isEmpty()) 
      canyyeffectcontrol->setObjectName(QStringLiteral("canyyeffectcontrol")); 
     canyyeffectcontrol->resize(432, 210); 
     canyyeffectcontrol->setMinimumSize(QSize(153, 119)); 
     canyyeffectcontrol->setMaximumSize(QSize(432, 210)); 
     gridLayout = new QGridLayout(canyyeffectcontrol); 
     gridLayout->setObjectName(QStringLiteral("gridLayout")); 
     Threshold2Slider = new QSlider(canyyeffectcontrol); 
     Threshold2Slider->setObjectName(QStringLiteral("Threshold2Slider")); 
     Threshold2Slider->setOrientation(Qt::Horizontal); 

     gridLayout->addWidget(Threshold2Slider, 4, 1, 1, 2); 

     Threshold1Label = new QLabel(canyyeffectcontrol); 
     Threshold1Label->setObjectName(QStringLiteral("Threshold1Label")); 

     gridLayout->addWidget(Threshold1Label, 2, 0, 1, 1); 

     ApertureSizeLabel = new QLabel(canyyeffectcontrol); 
     ApertureSizeLabel->setObjectName(QStringLiteral("ApertureSizeLabel")); 

     gridLayout->addWidget(ApertureSizeLabel, 5, 0, 1, 1); 

     Threshold2Label = new QLabel(canyyeffectcontrol); 
     Threshold2Label->setObjectName(QStringLiteral("Threshold2Label")); 

     gridLayout->addWidget(Threshold2Label, 4, 0, 1, 1); 

     Threshold1Spin = new QSpinBox(canyyeffectcontrol); 
     Threshold1Spin->setObjectName(QStringLiteral("Threshold1Spin")); 

     gridLayout->addWidget(Threshold1Spin, 2, 3, 1, 1); 

     Threshold2Spin = new QSpinBox(canyyeffectcontrol); 
     Threshold2Spin->setObjectName(QStringLiteral("Threshold2Spin")); 

     gridLayout->addWidget(Threshold2Spin, 4, 3, 1, 1); 

     ApertureSizeSpin = new QSpinBox(canyyeffectcontrol); 
     ApertureSizeSpin->setObjectName(QStringLiteral("ApertureSizeSpin")); 

     gridLayout->addWidget(ApertureSizeSpin, 5, 3, 1, 1); 

     ApertureSizeSlider = new QSlider(canyyeffectcontrol); 
     ApertureSizeSlider->setObjectName(QStringLiteral("ApertureSizeSlider")); 
     ApertureSizeSlider->setOrientation(Qt::Horizontal); 

     gridLayout->addWidget(ApertureSizeSlider, 5, 1, 1, 2); 

     Threshold1Slider = new QSlider(canyyeffectcontrol); 
     Threshold1Slider->setObjectName(QStringLiteral("Threshold1Slider")); 
     Threshold1Slider->setOrientation(Qt::Horizontal); 

     gridLayout->addWidget(Threshold1Slider, 2, 1, 1, 1); 

     EL2GLabel = new QCheckBox(canyyeffectcontrol); 
     EL2GLabel->setObjectName(QStringLiteral("EL2GLabel")); 

     gridLayout->addWidget(EL2GLabel, 0, 0, 1, 1); 


     retranslateUi(canyyeffectcontrol); 

     QMetaObject::connectSlotsByName(canyyeffectcontrol); 
    } // setupUi 

    void retranslateUi(QWidget *canyyeffectcontrol) 
    { 
     canyyeffectcontrol->setWindowTitle(QApplication::translate("canyyeffectcontrol", "Canny effect control", 0)); 
     Threshold1Label->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 1", 0)); 
     ApertureSizeLabel->setText(QApplication::translate("canyyeffectcontrol", "Aperture size", 0)); 
     Threshold2Label->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 2", 0)); 
     EL2GLabel->setText(QApplication::translate("canyyeffectcontrol", "Enable L2G", 0)); 
    } // retranslateUi 

}; 

namespace Ui { 
    class canyyeffectcontrol: public Ui_canyyeffectcontrol {}; 
} // namespace Ui 

QT_END_NAMESPACE 

#endif // UI_CANYYEFFECTCONTROL_H 

è che significa che dovrei riscrivere il codice per liberare memoria (unique _ptr per esempio) e il codice dovrebbe essere come questo

/******************************************************************************** 
** Form generated from reading UI file 'canyyeffectcontrol.ui' 
** 
** Created by: Qt User Interface Compiler version 5.0.2 
** 
** WARNING! All changes made in this file will be lost when recompiling UI file! 
** I modify the code 
********************************************************************************/ 

#ifndef UI_CANYYEFFECTCONTROL_H 
#define UI_CANYYEFFECTCONTROL_H 

#include <QtCore/QVariant> 
#include <QtWidgets/QAction> 
#include <QtWidgets/QApplication> 
#include <QtWidgets/QButtonGroup> 
#include <QtWidgets/QCheckBox> 
#include <QtWidgets/QGridLayout> 
#include <QtWidgets/QHeaderView> 
#include <QtWidgets/QLabel> 
#include <QtWidgets/QSlider> 
#include <QtWidgets/QSpinBox> 
#include <QtWidgets/QWidget> 

QT_BEGIN_NAMESPACE 

class Ui_canyyeffectcontrol 
{ 
public: 
    std::unique_ptr<QGridLayout> gridLayout; 
    std::unique_ptr<QSlider> Threshold2Slider; 
    std::unique_ptr<QLabel> Threshold1Label; 
    std::unique_ptr<QLabel> ApertureSizeLabel; 
    std::unique_ptr<QLabel> Threshold2Label; 
    std::unique_ptr<QSpinBox>Threshold1Spin; 
    std::unique_ptr<QSpinBox> Threshold2Spin; 
    std::unique_ptr<QSpinBox> ApertureSizeSpin; 
    std::unique_ptr<QSlider> ApertureSizeSlider; 
    std::unique_ptr<QSlider> Threshold1Slider; 
    std::unique_ptr<QCheckBox> EL2GLabel; 

    void setupUi(QWidget *canyyeffectcontrol) 
    { 
     if (canyyeffectcontrol->objectName().isEmpty()) 
      canyyeffectcontrol->setObjectName(QStringLiteral("canyyeffectcontrol")); 
     canyyeffectcontrol->resize(432, 210); 
     canyyeffectcontrol->setMinimumSize(QSize(153, 119)); 
     canyyeffectcontrol->setMaximumSize(QSize(432, 210)); 
     gridLayout = std::unique_ptr<QGridLayout> (new QGridLayout(canyyeffectcontrol)); 
     gridLayout->setObjectName(QStringLiteral("gridLayout")); 
     Threshold2Slider = std::unique_ptr<QSlider>(new QSlider(canyyeffectcontrol)); 
     Threshold2Slider.get()->setObjectName(QStringLiteral("Threshold2Slider")); 
     Threshold2Slider.get()->setOrientation(Qt::Horizontal); 

     gridLayout.get()->addWidget(Threshold2Slider.get(), 4, 1, 1, 2); 

     Threshold1Label = std::unique_ptr<QLabel> (new QLabel(canyyeffectcontrol)); 
     Threshold1Label.get()->setObjectName(QStringLiteral("Threshold1Label")); 

     gridLayout.get()->addWidget(Threshold1Label.get(), 2, 0, 1, 1); 

     ApertureSizeLabel = std::unique_ptr<QLabel> (new QLabel(canyyeffectcontrol)); 
     ApertureSizeLabel.get()->setObjectName(QStringLiteral("ApertureSizeLabel")); 

     gridLayout.get()->addWidget(ApertureSizeLabel.get(), 5, 0, 1, 1); 

     Threshold2Label = std::unique_ptr<QLabel> (new QLabel(canyyeffectcontrol)); 
     Threshold2Label.get()->setObjectName(QStringLiteral("Threshold2Label")); 

     gridLayout.get()->addWidget(Threshold2Label.get(), 4, 0, 1, 1); 

     Threshold1Spin = std::unique_ptr<QSpinBox> (new QSpinBox(canyyeffectcontrol)); 
     Threshold1Spin.get()->setObjectName(QStringLiteral("Threshold1Spin")); 

     gridLayout.get()->addWidget(Threshold1Spin.get(), 2, 3, 1, 1); 

     Threshold2Spin = std::unique_ptr<QSpinBox> (new QSpinBox(canyyeffectcontrol)); 
     Threshold2Spin.get()->setObjectName(QStringLiteral("Threshold2Spin")); 

     gridLayout->addWidget(Threshold2Spin.get(), 4, 3, 1, 1); 

     ApertureSizeSpin = std::unique_ptr<QSpinBox> (new QSpinBox(canyyeffectcontrol)); 
     ApertureSizeSpin.get()->setObjectName(QStringLiteral("ApertureSizeSpin")); 

     gridLayout.get()->addWidget(ApertureSizeSpin.get(), 5, 3, 1, 1); 

     ApertureSizeSlider =std::unique_ptr<QSlider> (new QSlider(canyyeffectcontrol)); 
     ApertureSizeSlider.get()->setObjectName(QStringLiteral("ApertureSizeSlider")); 
     ApertureSizeSlider.get()->setOrientation(Qt::Horizontal); 

     gridLayout->addWidget(ApertureSizeSlider.get(), 5, 1, 1, 2); 

     Threshold1Slider =std::unique_ptr<QSlider> (new QSlider(canyyeffectcontrol)); 
     Threshold1Slider.get()->setObjectName(QStringLiteral("Threshold1Slider")); 
     Threshold1Slider.get()->setOrientation(Qt::Horizontal); 

     gridLayout.get()->addWidget(Threshold1Slider.get(), 2, 1, 1, 1); 

     EL2GLabel = std::unique_ptr<QCheckBox> (new QCheckBox(canyyeffectcontrol)); 
     EL2GLabel.get()->setObjectName(QStringLiteral("EL2GLabel")); 

     gridLayout.get()->addWidget(EL2GLabel.get(), 0, 0, 1, 1); 


     retranslateUi(canyyeffectcontrol); 

     QMetaObject::connectSlotsByName(canyyeffectcontrol); 
    } // setupUi 

    void retranslateUi(QWidget *canyyeffectcontrol) 
    { 
     canyyeffectcontrol->setWindowTitle(QApplication::translate("canyyeffectcontrol", "Canny effect control", 0)); 
     Threshold1Label.get()->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 1", 0)); 
     ApertureSizeLabel.get()->setText(QApplication::translate("canyyeffectcontrol", "Aperture size", 0)); 
     Threshold2Label.get()->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 2", 0)); 
     EL2GLabel.get()->setText(QApplication::translate("canyyeffectcontrol", "Enable L2G", 0)); 
    } // retranslateUi 

}; 

namespace Ui { 
    class canyyeffectcontrol: public Ui_canyyeffectcontrol {}; 
} // namespace Ui 

QT_END_NAMESPACE 

#endif // UI_CANYYEFFECTCONTROL_H 
+0

Potrebbe tagliare quel muro di codice verso il basso per le parti importanti? – arne

risposta

5

Leggi su come QObject classi derivate di gestire la memoria - in In poche parole, se un QObject è costruito con un genitore, verrà distrutto quando il genitore viene distrutto. Nel tuo esempio, sembra che tutto sia stato creato come figlio di canyyeffectcontrol, quindi tali oggetti verranno distrutti quando questo è.

0

Il framework Qt crea un albero di relazioni genitore-figlio. L'argomento costruttore per il QSlider s, ad esempio, è il genitore. Dopo la distruzione del genitore, anche tutti i bambini sono distrutti in modo ricorsivo, quindi non c'è bisogno che tu pulisca qualcosa, se hai le tue relazioni genitore-figlio giuste.

Se c'è ancora perdita di memoria (verificare con valgrind), questo potrebbe essere un bug Qt o non è stato impostato correttamente le relazioni.

3

No! Non dovresti modificare i file generati da Qt.

prima ragione (nel vero intestazione del file generato):

ATTENZIONE! Tutte le modifiche apportate in questo file andranno perse durante la ricompilazione del file dell'interfaccia utente!

Ciò significa che le modifiche saranno persi ogni volta che si modifica anche il più piccolo frammento della vostra interfaccia utente (che è di per sé un problema terribile, dover modificare di volta in volta ad ogni cambio UI)

In secondo luogo, Qt gestisce la memoria a modo suo, con un meccanismo di widget genitore/figlio che si occupano della gestione della memoria. È possibile trovare su questo here e here.

Per i file generati, non ci si deve preoccupare di questo. Poi, per il proprio file (widget personalizzati per esempio), non si dovrebbe usare delete sia, ma prendersi cura QObject::deleteLater()