Qt 多个ui界面 子ui调用mainwindow主ui中对象的函数

1 前提:

  • 环境 Qt 5.12 Vs2017
  • mainwindow中建立多个ui文件,例如新建一个继承了QWidget的widget form 独立ui文件,并写好其对应的.h和.cpp文件,这里为类widget0
  • 在mainwindow中有一个控件widget,将该widget提升为刚才我们新建的widget0,这样在运行时可以显示两个ui。

2 产生的问题:

这两个ui界面都想调用另外一个类对象的函数,该如何处理?

  • 方法1:在子ui类中实例化对象->在子Ui类和mainwindow中均可调用对象成员函数,因为mainwindow类获取widget0指针较为容易
  • 方法2:在mainwindow中实例化对象,在子ui类调用对象成员函数,需要获取mainwindow的指针才可以实现,但是不能再widget0中包含mainwindow的头文件(原因参考(可以戳))
    转载于:https://www.cnblogs.com/jiguang321/p/11692736.html

问题描述:最近在用qt开发项目的时候,有一个需要就是在子类中调用mainwindow指针,在mainwindow上显示内容。
因为在mainwindow中需要生成子类的对象,所以不能在子类中引用mainwindow的头文件,这样会造成相互包含报错!
后来查到大家推荐使用parentWidget这个方法,然而在我的项目中该函数返回的却是一个nullptr,这就让人郁闷了!
不过好在还是有办法可以解决的:
在子类的头文件中我并没有引用mainwindow的头文件,而是先定义了一个void指针
在这里插入图片描述
cpp文件中,在构造函数中将接收到的父对象强转为mainwindow类型的指针,这样就完美解决问题,就可以在子类中开心的调用mainwindow中的成员函数了。
在这里插入图片描述
有一点需要提醒和我一样白的小白的是,在这里插入图片描述
这句引用要放在子类的cpp文件中。
然而,怎么使用这个指针呢?
在这里插入图片描述
将void* 强转为 mainwindow* 就可以使用了。
上述做法的原因是:指针变量的意义是存储内存块的首地址,只不过在使用的时候对于不同类型的指针所操作的内存长度不同,
另外,为什么可以用void呢?因为void 可以转化为任何类型的指针,而其他则不可以转void*,举个例子:你可以说猫咪是动物,但不可以说动物是猫咪,嘻嘻,现在懂了吧!
所以我们在使用的时候需要将void* 转为 mainwindow* ,这样就可以按照mainwindow在内存中的规则来操作了。
虽然这样解决了问题,但是我还是觉得这样可能不是一个完美的解决办法,希望有更好的解决办法的小伙伴给个留言!

3 解决:

3.1效果图

在这里插入图片描述

3.2描述

创建了两个类a和b,a在mainwindow中实例化,b在widget0中实例化
a类来测试方法1,b类来测试方法2

3.3代码

3.3.1 程序结构

在这里插入图片描述

3.3.2 ui界面

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

a.h
#pragma once
#include 
  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值