关于为什么使用auto *frame1 = new QFrame(this);这种方式在堆上创建对象。

文章比较了在Qt中使用new在堆上和直接在栈上创建QFrame对象的区别,强调了堆上对象的生命周期管理和在UI布局中的适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两种写法的主要区别在于对象的生命周期和存储位置。

  • QFrame *frame = new QFrame(this);

    这种写法是在堆上创建一个新的 QFrame 对象。这个对象的生命周期会一直持续到你显式地删除它,或者它的父对象被删除。这种写法常用于 Qt 的父子对象系统,因为 Qt 会自动删除所有的子对象。

  • QFrame frame(this);

    这种写法是在栈上创建一个 QFrame 对象。这个对象的生命周期只在当前的作用域内,一旦离开这个作用域,这个对象就会被自动删除。

所以,习惯上我们更倾向于使用 new 在堆上创建对象,这样可以更好地控制对象的生命周期,并利用 Qt 的父子对象系统进行内存管理。

作为对比:

    auto *frame1 = new QFrame(this);
    frame1->setFrameStyle(QFrame::Box);
    frame1->setCursor(Qt::SizeAllCursor);
    auto *frame2 = new QFrame(this);
    frame2->setFrameStyle(QFrame::Box);
    frame2->setCursor(Qt::WaitCursor);
    QFrame frame3 (this);
    frame3.setFrameStyle(QFrame::Box);
    frame3.setCursor(Qt::PointingHandCursor);

    auto *grid = new QGridLayout(this);
    grid->addWidget(frame1, 0, 0);
    grid->addWidget(frame2, 0, 1);
    grid->addWidget(&frame3, 0, 2);
    

在代码中,frame3 是一个局部变量,它在栈上创建。当执行到函数的末尾时,局部变量 frame3 就会被销毁,也就是说 frame3 的生命周期结束了。因此,当你试图在界面上显示 frame3 时,它可能已经被销毁了,所以看不到它。

相反,frame1 和 frame2 是在堆上创建的,它们的生命周期直到显式地删除它们或者它们的父对象被删除时才结束。因此,可以在界面上看到 frame1 和 frame2

如果你想让 frame3 在界面上显示,你应该在堆上创建它,就像 frame1 和 frame2 那样:

auto *frame3 = new QFrame(this);
frame3->setFrameStyle(QFrame::Box);
frame3->setCursor(Qt::PointingHandCursor);

然后像之前那样将 frame3 添加到布局中:

grid->addWidget(frame3, 0, 2);

这样,frame3 就会在界面上正确显示了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值