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