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


    前言

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

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

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

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

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

    这里创建的类型是 QWidget

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

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

    1. static Widget *wid; //定义一个静态的Widget类变量
    2. 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() 的代码:

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

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

    1. void Widget::on_pushButton_clicked()
    2. {
    3. static_test();
    4. }

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

    总结

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

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

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

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

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

    1. class sky
    2. {
    3. public:
    4. static void test();//静态成员函数
    5. };

    将private: 中的

        Ui::Widget *ui;

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

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

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

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

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

    1. void Widget::on_pushButton_clicked()
    2. {
    3. //static_test();
    4. sky::test();
    5. }

    这样就可以了

  • 相关阅读:
    Docker安装Oracle18c 坑已排完,放心食用
    springboot集成kafka
    docker镜像配置mysql、redis
    完全二叉树你需要了解一下
    FF14 一些赚金币的小技巧(持续更新中)
    【C++】继承
    神经元人体分布大图,人体的神经元图片
    B站:TED-ED 世界人文历史英文动画100集【双语字幕】(第1集)
    PostgreSQL 导出数据为CSV
    新一轮智能汽车“硬核”战,头部企业如何决胜下半场?
  • 原文地址:https://blog.csdn.net/s806903/article/details/126687805