2013-07-25 82 views
5

這是一個從qt ui文件生成的代碼,我看到該代碼使用關鍵字new來分配內存,但在類中沒有delete關鍵字來刪除分配的資源,這個錯誤是由QT開發者還是有別的東西(沒有釋放資源)?Qt UI Generator不會釋放資源

/******************************************************************************** 
** 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 

是不是說我應該重寫代碼來釋放內存(unique _ptr爲例),代碼應該是這樣的

/******************************************************************************** 
** 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

您是否可以將代碼牆修剪到重要部分? – arne

回答

5

QObject派生類如何管理內存閱讀起來 - 在簡而言之,如果一個QObject由父項構建,那麼當父項被銷燬時它將被銷燬。在你的例子中,它看起來像所有東西都是作爲canyyeffectcontrol的孩子創建的,所以這些對象將在此時被銷燬。

0

Qt框架構建了一個父子關係樹。例如,QSlider的構造函數參數是父項。一旦父母遭到破壞,所有的孩子也會被遞歸地銷燬,所以如果你的父母與孩子之間的關係正確,你就不需要清理任何東西。

如果仍然存在內存損失(使用valgrind進行檢查),這可能是一個Qt錯誤,或者您沒有建立正確的關係。

3

不!你不應該修改Qt的生成文件。

第一個原因(在文件的最頭生成):

警告!重新編譯UI文件時,此文件中所做的所有更改都將丟失!

這意味着您的修改將在每次修改甚至UI的哪怕一丁點時間丟失(這本身就是一個可怕的問題,必須與每一個UI的變化再次進行修改的時間和時間)

其次,Qt以自己的方式處理內存,並有一個父/子部件的機制來處理內存處理。你可以找到關於這個herehere

對於生成的文件,您不應該在意這一點。然後,對於您自己的文件(例如自定義小部件),您不應使用delete,而是照顧QObject::deleteLater()