当前位置: 首页 > news >正文

QT静态成员函数访问和操作UI对象

前言

普通成员函数可以访问静态成员函数,而静态成员函数并不能直接访问普通成员函数!

UI对象属于普通成员函数,因此静态成员函数不能直接访问UI对象,编译时会报错。如图:

网络上的说法,大多是使用QT的信号和槽机制来解决静态成员函数访问UI对象。。

但其实没这么麻烦,有更简单的实现方法。

一、首先创建一个测试工程

这里创建的类型是 QWidget:

 在UI中拖入一个文本编辑框(Text Edit)和一个按钮(Push Button),如图:

二、在 .h头文件中,添加代码:

static Widget *wid; //定义一个静态的Widget类变量
static void static_test(); //静态成员函数

如图:

三、在.cpp文件中初始化wid:

Widget *Widget::wid=nullptr; //静态成员使用前必须先初始化

如图:

需要注意的是:

   1、初始化不能在.h文件中定义时进行:static Widget *wid= nullptr; 这样会报错!

   2、初始化不能放在函数内

三、在Widget构造函数中,将this给到wid

wid = this;

如图:

四、在.cpp文件中写入静态成员函数 static_test() 的代码:

//静态成员函数:
void Widget::static_test(){
    wid->ui->textEdit->setText("sky");
}

五、在按钮点击事件中调用静态成员函数: 

void Widget::on_pushButton_clicked()
{
    static_test();
}

点击按钮后发现,文本编辑框中出现了静态成员函数中设置的文本:

总结

静态成员函数之所以不能访问UI对象,是因为静态成员函数中没有this!

因此,定义一个 wid 来存储this,这样就实现了间接使用this,也就实现了对UI对象的访问和操作

在其它类的静态成员函数中调用 wid 访问UI对象

前面已经讲了本类中的访问,现在再来试一下第三方类:

在.h文件中定义一个类:

class sky
{

public:
    static void test();//静态成员函数
};

将private: 中的

    Ui::Widget *ui;

移到public: 如图(其它类不能访问私有对象):

 在.cpp文件中写入这个类的代码:

void sky::test(){//静态成员函数
    Widget::wid->ui->textEdit->setText("aaa");
}

和前面在本类中的访问不同,在其它类中需要指定类名(Widget) 

在按钮点击事件中,调用第三方类的静态成员函数:

void Widget::on_pushButton_clicked()
{
    //static_test();
    sky::test();
}

这样就可以了

相关文章:

  • 计算机组成原理学习笔记:计算机系统的层次结构
  • 猿创征文|工作中遇到技术盲区后的自我成长
  • SpringCloud 三种服务调用方式,你学会了吗?
  • 路由-hash和history模式的区别
  • 剑指:二叉树有关题目
  • 四天拿捏SpringSecurity?这份阿里架构师编写的理论与实战结合的学习笔记到底有多强
  • Hive3.1.2的HQL执行过程
  • 浅谈前端微服务背景及Micro-app的使用
  • 【Notepad】Notepad++ 安装XML/Json插件,格式化xml/json文件
  • 3分钟学会批量混合查询多家快递的物流信息
  • ElasticSearch Query DSL(二)
  • 【重识云原生】第六章容器6.1.7.1节——Docker核心技术cgroups综述
  • 关于C# HttpClient 的用法及相关问题的解决方法
  • illustrator插件-什么是脚本-如何使用-什么是动作-AI插件
  • UVA 10405【LCS】【背包】
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • CentOS6 编译安装 redis-3.2.3
  • C语言笔记(第一章:C语言编程)
  • Docker: 容器互访的三种方式
  • es6(二):字符串的扩展
  • FineReport中如何实现自动滚屏效果
  • HashMap剖析之内部结构
  • LeetCode算法系列_0891_子序列宽度之和
  • nodejs实现webservice问题总结
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 排序算法之--选择排序
  • 前端_面试
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 为什么要用IPython/Jupyter?
  • 一、python与pycharm的安装
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 《码出高效》学习笔记与书中错误记录
  • hi-nginx-1.3.4编译安装
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C++)八皇后问题
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • // an array of int
  • /boot 内存空间不够
  • @Bean有哪些属性
  • [ C++ ] STL_list 使用及其模拟实现
  • [ C++ ] STL---string类的模拟实现
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [Android] Upload package to device fails #2720
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [BIZ] - 1.金融交易系统特点
  • [BZOJ1008][HNOI2008]越狱
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [Docker]五.Docker中Dockerfile详解
  • [HDU3710]Battle over Cities