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_NAMESPACE

class Base : public QMainWindow
{
    Q_OBJECT

public:
    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_OBJECT

public:
    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的成员,方法和控件了。

  • 12
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青云客_Hugh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值