目录
Qt之如何获取主窗口的指针
Qt 子对象引用mainwindow指针的巧妙方法 (***)
QT通过parentWidget()实现多界面跳转及关闭(切换界面和返回前一界面)
Qt之如何获取主窗口的指针
Qt--在其他类中使用mainwindow主窗口的UI指针
QVariant 存取任意类型的指针:
但比较消耗内存,影响运行速度??
----------------------------------------------
官方库函数:parentWidget()
QWidget *QWidget:: parentWidget() const
Returns the parent of this widget, or nullptr if it does not have any parent widget.
输出结果:
form parent : MainWindow(0x99fd20, name="MainWindow")
----------------------------------------------------
参考:
QVariant 存取任意类型的指针 、自定义数据类型
https://blog.youkuaiyun.com/ken2232/article/details/131733264
QVariant类
https://blog.youkuaiyun.com/ken2232/article/details/131732801
Qt 子对象引用mainwindow指针的巧妙方法 (***)
https://blog.youkuaiyun.com/ken2232/article/details/129638483
Qt里通过传递函数指针实现动态绑定信号/槽 (**)
https://blog.youkuaiyun.com/ken2232/article/details/131566404
----------------------------------------------------
===========================
QT通过parentWidget()实现多界面跳转及关闭(切换界面和返回前一界面):
不需要跳转界面相互包含头文件,超简单的方法。
先将第一级的窗口this指针传给次级的的窗口,子窗口通过parentWidget(),返回第一级的this并用来调用show
//传递主界面的this指针给跳转界面
new_widget *win = new new_widget(this);
//调用parentWidget()返回上一界面的this指针,并显示
this->parentWidget()->show();
搞定,就这么简单,下面是详细过程。
————————————————
版权声明:本文为优快云博主「泡枸杞的程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/m0_47095592/article/details/124527684
Qt 子对象引用mainwindow指针的巧妙方法 (***)
问题描述:最近在用qt开发项目的时候,有一个需要就是在子类中调用mainwindow指针,在mainwindow上显示内容。
因为在mainwindow中需要生成子类的对象,所以不能在子类中引用mainwindow的头文件,这样会造成相互包含报错!
后来查到大家推荐使用parentWidget这个方法,然而在我的项目中该函数返回的却是一个nullptr
不过好在还是有办法可以解决的:
在子类的头文件中我并没有引用mainwindow的头文件,而是先定义了一个void指针

(子类的)cpp文件中,在构造函数中将接收到的父对象强转为mainwindow类型的指针,这样就完美解决问题,就可以在子类中开心的调用mainwindow中的成员函数了。

有一点需要提醒和我一样白的小白的是,

这句引用要放在子类的cpp文件中。
然而,怎么使用这个指针呢?

将void* 强转为 mainwindow* 就可以使用了。
上述做法的原因是:指针变量的意义是存储内存块的首地址,只不过在使用的时候对于不同类型的指针所操作的内存长度不同,
另外,为什么可以用void*呢?
因为void* 可以转化为任何类型的指针,而其他则不可以转void*,举个例子:你可以说猫咪是动物,但不可以说动物是猫咪,嘻嘻,现在懂了吧!
所以我们在使用的时候需要将void* 转为 mainwindow* ,这样就可以按照mainwindow在内存中的规则来操作了。
虽然这样解决了问题,但是我还是觉得这样可能不是一个完美的解决办法,希望有更好的解决办法的小伙伴给个留言!
https://www.cnblogs.com/jiguang321/p/11692736.html
参考:
开放 Qt窗口的 this指针 的方法汇总 (*****)
Qt 子对象引用mainwindow指针的巧妙方法 (***)
Qt之如何获取主窗口的指针
QMainWindow* getMainWindow()
{
foreach (QWidget *w, qApp->topLevelWidgets())
if (QMainWindow* mainWin = qobject_cast<QMainWindow*>(w))
return mainWin;
return nullptr;
}
https://blog.youkuaiyun.com/caoshangpa/article/details/78589776
QT---获取主窗口指针
MainWindow *ptr = NULL;
ptr = (MainWindow*)parentWidget();
注:需要子窗口实例化之后,才有效。
Form xform(this); //要带 (this) 实例化
https://blog.youkuaiyun.com/u013345672/article/details/119182584
Qt--在其他类中使用mainwindow主窗口的UI指针
需求背景:在其他类中使用mainwindow主窗口的UI指针改变界面元素
计划实现思路:
1、将主窗口中的Ui::MainWindow *ui指针传递给需要使用它的类
2、在该类中使用传递进来的指针操作界面元素
注意:为什么不传递主窗口的指针?因为一般情况下ui是一个私有成员,不能在类外调用它。
工程构成图如下:

说明:
1、在 Test类 中改变 MainWindow类 中 label标签 的文本内容。
2、Test类 和 MainWindow类 相互包含 记得在各自头文件中前置声明对方
3、要使用ui指针操作界面元素,Test类的头文件中这句代码必须有 #include "ui_mainwindow.h"
---------------------------------分割线---------------------------------
Test.h 代码如下
#ifndef TEST_H
#define TEST_H
#include <QObject>
#include "mainwindow.h"
#include "ui_mainwindow.h"
class MainWindow; // 前置声明
class Test : public QObject
{
Q_OBJECT
public:
explicit Test(Ui::MainWindow * p);
Ui::MainWindow* exUI;
signals:
};
#endif // TEST_H
Test.cpp 代码如下
#include "test.h"
Test::Test(Ui::MainWindow * p):
exUI(p)
{
exUI->label->setText("11111");
}
mainwindow.h 代码如下
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "test.h"
class Test; // 前置声明
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
Test* pTest;
};
#endif // MAINWINDOW_H
mainwindow.cpp 代码如下
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
pTest = new Test(ui); // 将ui指针传入Test类
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:

————————————————
版权声明:本文为优快云博主「_范迪塞尔_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/suki2012/article/details/115741255
https://blog.youkuaiyun.com/suki2012/article/details/115741255