2013-07-25 37 views
5

đây là mã được tạo từ tệp qt ui, tôi thấy rằng mã sử dụng new từ khóa để phân bổ bộ nhớ nhưng không có từ khóa trong lớp để xóa tài nguyên được phân bổ, là lỗi này qt các nhà phát triển hoặc có cái gì khác (không có tài nguyên deallocated)?Qt UI Generator không giải quyết tài nguyên

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

là có nghĩa là tôi nên viết lại mã để giải phóng bộ nhớ (unique _ptr ví dụ) và mã nên được như thế này

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

Bạn có thể cắt bức tường mã đó thành các phần quan trọng không? – arne

Trả lời

5

Đọc trên bao QObject các lớp thừa kế quản lý bộ nhớ - trong Tóm lại, nếu một QObject được xây dựng với một phụ huynh, sau đó nó sẽ bị phá hủy khi cha mẹ bị phá hủy. Trong ví dụ của bạn, có vẻ như mọi thứ được tạo dưới dạng con của canyyeffectcontrol, vì vậy những đối tượng đó sẽ bị hủy khi có.

0

Khung Qt xây dựng một cây quan hệ cha-con. Đối số hàm tạo cho ví dụ QSlider s là cha mẹ. Sau khi cha mẹ phá hủy, tất cả trẻ em cũng bị phá hủy đệ quy, vì vậy bạn không cần phải dọn dẹp bất cứ thứ gì, nếu bạn có mối quan hệ cha-con của bạn đúng.

Nếu vẫn còn mất trí nhớ (kiểm tra với valgrind), đây có thể là lỗi Qt hoặc bạn chưa thiết lập đúng mối quan hệ.

3

Không! Bạn không nên sửa đổi các tệp đã tạo của Qt.

lý do đầu tiên (trong tiêu đề rất của tập tin được tạo ra):

CẢNH BÁO! Tất cả các thay đổi được thực hiện trong tệp này sẽ bị mất khi biên dịch lại tệp giao diện người dùng!

Điều đó có nghĩa thay đổi của bạn sẽ bị mất mỗi khi bạn thay đổi ngay cả những bit nhỏ nhất của giao diện người dùng của bạn (mà là bởi chính nó là một vấn đề khủng khiếp, phải sửa đổi nó nhiều lần với mọi thay đổi UI)

Thứ hai, Qt xử lý bộ nhớ theo cách riêng của nó, với một cơ chế của các widget cha/con mà tự chăm sóc cho việc xử lý bộ nhớ. Bạn có thể tìm hiểu về điều này herehere.

Đối với các tệp được tạo, bạn không cần phải quan tâm đến điều đó. Sau đó, đối với tệp của riêng bạn (ví dụ như tiện ích con tùy chỉnh), bạn không nên sử dụng delete hoặc xem xét QObject::deleteLater()

Các vấn đề liên quan