赞
踩
说明:
简单点的方法就是用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的成员,方法和控件了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。