吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 714|回复: 6
收起左侧

[求助] qt点按钮切换其他窗口只能用指针吗

[复制链接]
dong555 发表于 2023-3-23 11:42
用下面的代码不行
[C++] 纯文本查看 复制代码
void Form_login::on_pushButton_clicked(){
    Widget   w;
    w.show();
    close();
}


后来查了下用下面代码就可以
[C++] 纯文本查看 复制代码
void Form_login::on_pushButton_clicked()
{

    Widget * w =new Widget;
    w->show();
    close();
}



main()下面用

Widget   w;

w.show();
又能直接显示出来的

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

psvajaz 发表于 2023-3-23 11:53
本帖最后由 psvajaz 于 2023-3-23 11:55 编辑

其实在开发中不建议使用方法二实现,应该是在父窗体中实现弹窗操作,因为你在同级窗体中调用,会存在资源释放的问题。
代码1:在窗体方法中定义了一个类变量,当调用了类变量show后,把本窗体关掉了,内核会触发释放类变量的资源释放,会出现widget窗体显示后立即被关闭
代码2:因为使用指针调用,关闭窗体后,指针对象不会被立刻销毁,所以会出现正常widget窗体的效果,但是对于资源释放的角度来说,widget的窗体一致存在,无法被释放,容易出现内存溢出
阿阿阿阿勇 发表于 2023-3-23 13:17
方法二这样,会内存泄漏啊,你这函数执行完,new出来的内存没有被释放,并且你永远无法访问到了.....
 楼主| dong555 发表于 2023-3-23 15:28
阿阿阿阿勇 发表于 2023-3-23 13:17
方法二这样,会内存泄漏啊,你这函数执行完,new出来的内存没有被释放,并且你永远无法访问到了.....

那还有什么好方法切换窗口
ouun 发表于 2023-3-23 16:00
第一种不是不行,你直接Widget   w; 是在栈上分配的内存。这个方法执行完毕这个w对象就销毁了。
main()中可以使用是因为,你在main()中开始 qt的事件循环  QApplication a(argc, argv); return a.exec();   在程序没有退出前,w不会被销毁,所以你能看到新widget。
你要是想实现窗口切换,可以在主界面中定义一个属性  Widget * w,然后在主界面的构造函数中 w =  new Widget;使用new 关键字在堆中分配空间。需要显示时,使用w->show();即可
 楼主| dong555 发表于 2023-3-23 17:40
阿阿阿阿勇 发表于 2023-3-23 13:17
方法二这样,会内存泄漏啊,你这函数执行完,new出来的内存没有被释放,并且你永远无法访问到了.....

把Widget * w;写入类的私有变量
第2个代码改成
w = new Widget;
w->show();
close();

再在Form_login的析构函数加入delete语句就可以了吧
比如加入这个
if (w != null)
delete  w;
阿阿阿阿勇 发表于 2023-3-31 08:38
dong555 发表于 2023-3-23 17:40
把Widget * w;写入类的私有变量
第2个代码改成
w = new Widget;

这种方法是可以的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表