Qt 子对象引用mainwindow指针的巧妙方法 (***)

目录

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指针 的方法汇总 (*****)

http://t.csdn.cn/f83p4

Qt 子对象引用mainwindow指针的巧妙方法 (***)

http://t.csdn.cn/N8cbi

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值