zoukankan      html  css  js  c++  java
  • 窗体间传递数据(跨控件跨类),三种情况与处理方法

    环境:Qt5.5 MCVS2013 
    IDE:QtCreator 
    范例代码下载地址:http://download.csdn.net/detail/shihoongbo/9134859

    发现很多Qt的初学者,经常会在“窗体间如何传递数据”的问题上卡住,而网上通常只是简单描述为使用信号与槽(signal& slot)机制来传递 
    虽然信号与槽的传递方式确实没错,但是却不一定能适用到全部的情况。 
    所以,总结了窗体间传递数据的三种情况和对应方法:

    模型描述: 

    已知三个窗体,A为B C的父控件,B与C互为兄弟控件 
    那么参数传递分三种情况: 
    1.B向A(C向A)传递参数 
    2.B向C(C向B)传递参数 
    3.A向B(A向C)传递参数

    情况1: 
    网上描述的“信号与槽”进行参数传递,基本上都是情况1 
    在类B中设置一个信号并发射,在A中设定槽,并connect接收 
    B的代码

    //B.h
    class B
    {
    ......
    signals:
        void toA([ParamList]);
    }
    
    //B.cpp
    B::B()
    {
        emit toA([ParamList]);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    A的代码

    //A.h
    class A
    {
    ....
    private:
       B *b;
    private slots:
       void fromB([ParamList]);
    }
    
    //A.cpp
    A::A()
    {
    b=new A;
    connect(b,SIGNAL(toA([ParamList])),this,SLOT(fromB([ParamList])));
    }
    void A::fromB([ParamList])
    {
    //get[ParamList]
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    情况2: 
    关于A窗体下的两个子窗体间传递数据,发送信号的操作在对应的子窗体中,连接信号与槽的操作应该在主窗体A中; 
    假设B向C发送数据

    //A.h
    {
    ......
    private:
      B *b;
      C *c;
    }
    //A.cpp
    A::A()
    {
      b=new B;
      c=new C;
      connect(b,SIGNAL(toC([ParamList]),c,SLOT(fromB([ParamList])));
    }
    
    //B.h
    class B
    {
    .....
    signals:
     void toC([ParamList]);
    }
    //B.cpp
    B::B()
    {
      emit toC([ParamList]);
    }
    
    //C.h
    class C
    {
    ....
    private slots:
      void fromB([ParamList]);
    }
    //C.cpp
    void C::fromB([ParamList])
    {
    //get[ParamList]
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    情况3: 
    关于情况3,从父窗体向子窗体传递参数,在初学Qt的时候,纠结了很久却找不到方法,在子窗体的时候,无法得到父窗体的指针,那么connect的时候就没办法指定对应的信号来源。这个问题,网上似乎根本没有找到对应的解决方法。 
    想了很久,才突然恍然大悟,一直想着使用Qt“信号与槽”的机制来进行窗体间的数据传输,反而被局限了思维。却忘了C++本身的方法,直接在子窗体中留一个共有成员函数,让父窗体进行调用,自然就把数据传输了过去,从父窗体向子窗体(A->B/A->C)压根不需要使用“信号与槽”的参数传递方法
    假设A->B发送数据

    //B.h
    class B
    {
    .....
    public:
       void fromA([ParamList]);
    } 
    //B.cpp
    void B::fromA([ParamList])
    {
    //get[ParamList]
    }
    
    //A.h
    class A
    {
    .....
    private:
       B *b;
    }
    //A.cpp
    A:A()
    {
        b=new B;
        b->fromA([ParamList]);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    总结: 
    关于Qt窗体间的数据传输,基本上就是这三种模型 
    如果是跨多个窗体(A->B->C->D……),那么就需要一层一层的进行发送信号接收槽

    在写connect的时候,需要注意也是老生常谈的是,信号与槽的参数列表需要进行匹配(Qt5的特性是,槽函数的参数必须少于等于信号函数的参数,至于Qt4的是否有这种特性,我就没有专门查找资料了)

    关于情况3,最近也遇到不少Qt新手问这个问题,然而跟他们说在子窗体类中留一个公有成员函数,让父窗体类直接调用,却有大部分人仿佛根本不理解什么叫公有成员函数。 
    后来才发现,不少人学习Qt,C++基础几乎为零。一些半路出家的人,甚至把Qt当作一门语言来学习,实在是贻笑大方。不管怎样,Qt的基础是C++,学好C++才是王道。

    文章开头提供的范例代码下载链接,同时实现了情况1,2,3的所有模型

    http://blog.csdn.net/shihoongbo/article/details/48681979

  • 相关阅读:
    Sqlsugar中使用Codefrist创建数据库
    EFCore中CoreFrist多个上下文
    高并发
    优先级反转
    二叉树算法
    使用AJAX上传图片
    Entity Framework
    .Net面试题
    LC 1515. Best Position for a Service Centre (Simulated Annealing)
    git
  • 原文地址:https://www.cnblogs.com/findumars/p/5083315.html
Copyright © 2011-2022 走看看