当前位置: 首页 > news >正文

Qt 子窗体直接调用父窗体成员、函数、控件的方法

QT子窗体调用父窗体成员、函数、控件的方法
说明:
简单点的方法就是用parentWidget函数,子类中调用该函数然后强转成父窗体,就可以调用父窗体公有成员、函数了。

如果想调用父窗体的控件,要么让父窗体提供公有接口,要么直接把ui改成公有成员。
注意如果是在线程调用父窗体ui,最好用信号与槽,不然会出现你意想不到的情况,直接报错崩溃。信号与槽又有5种连接方式(可控制是否阻塞,是否有返回值等)感兴趣自行了解。
多个窗体嵌套其实也差不多。
下面就简单演示一下子窗体调用父窗体(有点取巧了):

Base类是父窗体,child类是子窗体

首先,父类的头文件声明子类。然后将父窗体的ui访问权限修改为public,并添加子窗体对象成员。
父窗体头文件 base.h:

#ifndef BASE_H
#define BASE_H#include <QMainWindow>// 声明子类
class Child;QT_BEGIN_NAMESPACE
namespace Ui { class Base; }
QT_END_NAMESPACEclass Base : public QMainWindow
{Q_OBJECTpublic:Base(QWidget *parent = nullptr);~Base();void Test();
public:Ui::Base *ui;// 子窗体对象Child *child;
};#endif // BASE_H

接着在子头文件声明父类,并添加父窗体对象(指针)。
子窗体头文件 child.h:

#ifndef CHILD_H
#define CHILD_H#include <QWidget>
#include <QDebug>//声明父窗体类Base
class Base;namespace Ui {
class Child;
}class Child : public QWidget
{Q_OBJECTpublic:explicit Child(QWidget *parent = nullptr);~Child();private:Ui::Child *ui;// 添加父窗体的对象成员,这里必须是指针Base *base;
};#endif // CHILD_H

在base.cpp里声明子类的头文件和ui头文件:
#include “child.h”
#include “ui_child.h”
base.cpp:

#include "base.h"
#include "ui_base.h"// 声明子类的头文件,才可以调用子类的对象
#include "child.h"
#include "ui_child.h"Base::Base(QWidget *parent): QMainWindow(parent), ui(new Ui::Base)
{ui->setupUi(this);//生成子窗体实例child = new Child(this);
}Base::~Base()
{delete ui;
}// 测试函数
void Base::Test()
{qDebug()<<"base test";
}

在child.cpp里声明父类的头文件和ui头文件:
#include “base.h”
#include “ui_base.h”
child.cpp:

#include "child.h"
#include "ui_child.h"// 在此声明 base.h 和 ui_base.h才可以调用父类对象,而且不会造成头文件声明冲突
#include "base.h"
#include "ui_base.h"Child::Child(QWidget *parent) :QWidget(parent),ui(new Ui::Child)
{ui->setupUi(this);// 通过parentWidget()函数,获取父窗体对象base = (Base *)parentWidget();// 调用base的公有方法和ui控件base->Test();base->ui->label->setText("base ui");
}Child::~Child()
{delete ui;
}

这样就可以子窗体child就可以直接调用父窗体base的成员,方法和控件了。


http://www.mrgr.cn/news/496.html

相关文章:

  • 语音助手Verbi:科技创新的未来
  • VS2017 MFC 使用3D_Button控件注意事项
  • 苍穹外卖-day03(SpringBoot+SSM的企业级Java项目实战)
  • 【STM32项目】在FreeRtos背景下的实战项目的实现过程(二)
  • 在Oracle中对比一张表的列是否在其他N张表的列
  • Linux对ubuntu的cuda相关操作
  • 搭建内网开发环境(一)|基于docker快速部署开发环境
  • 【AI趋势6】大模型与游戏共振
  • GitHub每日最火火火项目(8.19)
  • PYQT实现上传图片,保存图片
  • 在PHP中使用file_get_contents提取JSON值
  • 第12天 优惠卷的使用
  • 2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增
  • 克服编程学习中的挫败感,收获满满的成就感
  • 爬虫配置代理:保护隐私有效地抓取数据
  • 超网和无类间路由是什么?
  • 尊享奢睡新境界:康姿百德柔压磁性枕匠心设计引领品质睡眠革命
  • C# VideoCapture 多路视频播放
  • 在亚马逊云科技上部署开源大模型并利用RAG和LangChain开发生成式AI应用
  • vuex的原理和使用方法