我必须删除这些指针吗?

Dav*_*log 6 c++ qt

这是MainWindow我调用的类,并使用该函数show()使其对用户可见.

class MainWindow : public QMainWindow
{
    Q_OBJECT

    QWidget *centralWidget;
    QGridLayout* gridLayout;
    QGridLayout* infoBoxLayout;
    QHBoxLayout* buttonGroup;
    QHBoxLayout* subCategoryLayout;
    //... more widgets

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void setupUi();
    void setupConnections();

private slots:
    void add();
    void edit();
    void remove();
    void find();
    void clearAll();
    void screenshotDesktop();
    void screenshotApp();

    void currentSubCategoryChanged( const QString& );
    void curretCategoryChanged( const int );

    void keyPressEvent( QKeyEvent * );

};
Run Code Online (Sandbox Code Playgroud)

我为每个小部件(宏之后的那些指针Q_OBJECT)创建了一个新的对象new.但是,我没有在程序中的任何地方删除它们.这会导致Qt内存泄漏吗?或者Qt中的某些东西在销毁类时会自动删除它们吗?

The*_*ght 12

如果窗口小部件具有父集,则Qt将处理删除窗口小部件.对于MainWindow,当你关闭它时,MainWindow及其子节点将被清理,所以将父节点传递给小部件的构造函数: -

QHBoxLayout* buttonGroup = new QHBoxLayout(this); // where this is the parent (MainWindow)
Run Code Online (Sandbox Code Playgroud)

如果你创建一个像这样的小部件: -

QHBoxLayout* buttonGroup = new QHBoxLayout;
Run Code Online (Sandbox Code Playgroud)

并没有通过父母,那么它将不会被清理,你将不得不自己处理.

  • @Davlog如果设置了父级,则必须*不要*手动删除它们。您只删除自己拥有的东西。Qt父子计划包括所有权。设置小部件的父级后,您就不再拥有它,父级就拥有它。 (2认同)

rat*_*eak 5

如果将它们添加到gui层次结构中,则在MainWindow删除它们时将清除它们

这是因为父母对孩子的所有权(用gui的各种添加物设定)

所以this->add(centralWidget);会叫centralWidget->setParent(this);,这将让centralWidget被删除时,MainWindow被删除

你可以自己删除QObjects,但要注意悬挂指针(QPointer会在这里提供帮助).虽然我建议使用deleteLater()以确保当指针仍然存在于堆栈时没有奇怪的行为.

有关对象树的更多信息,请参见此处