您的位置:首页 > 科技 > 能源 > Qt 子窗体直接调用父窗体成员、函数、控件的方法

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

2024/9/30 6:30:28 来源:https://blog.csdn.net/love_dear/article/details/141226381  浏览:    关键词: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的成员,方法和控件了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com