dong555 发表于 2023-3-23 11:42

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

用下面的代码不行
void Form_login::on_pushButton_clicked(){
    Widget   w;
    w.show();
    close();
}

后来查了下用下面代码就可以
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)
deletew;

阿阿阿阿勇 发表于 2023-3-31 08:38

dong555 发表于 2023-3-23 17:40
把Widget * w;写入类的私有变量
第2个代码改成
w = new Widget;


这种方法是可以的{:1_921:}
页: [1]
查看完整版本: qt点按钮切换其他窗口只能用指针吗