窗体间传递数据(跨控件跨类),三种情况与处理方法

环境: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

时间: 2024-10-08 10:34:02

窗体间传递数据(跨控件跨类),三种情况与处理方法的相关文章

C# 窗体间传递数据

C#两个窗体之间传递数据 1 公用变量值传递 public partial class Form1 : Form //parent form { public string name=""; public Form1() { InitializeComponent(); } private void newBtn_Click(object sender, EventArgs e) { Form2 form2 =new Form2(); form2.ShowDialog(); if (f

VC 对话框背景颜色、控件颜色(三种方法)

系统环境:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为对话框设置背景颜色.控件颜色 既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框.为对话框设置背景颜色.控件颜色等等. 对话框背景颜色: 网上流传有四种方法(可能还不止),在VC++2008SP1测试后,发现只有三种可以使用了,其中第一种被废弃了.以下是四种方法: 方法一 (失效):调用CWinApp类的成员函数SetDialogBkColor来实现.       其中函数的第一个参数指定了背景颜色

C#不同窗体间通信,数据传递

在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后,准备献丑了. 1.       如果很多窗体都需要用到某一窗体的东西,比如登录窗体记录的ID,为了避免每个窗体都去查询数据库,可以把这些公共变量或信息写入配置文件,每个窗体去读配置文件即可. 2.       如果共享信息的窗体不多,则对于兄弟窗口,可以通过其共同的父窗体来传递数据,此时父窗体如果

跨数据存取控件Universal Data Access Components

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. 跨数据存取控件Universal Data Access Components

ExtJs实现复选框组Checkboxgroup单勾选及复选框组对多个复选框组跨控件全选

ExtJs实现复选框Checkboxgroup单勾选及跨控件全选 由于项目的需要,我们要将EXT的控件Checkboxgroup复选框组改造成但勾选,并且实现一个复选框组控制其他多个复选框组的全选,以下是关于如何实现的代码片段. 1.创建CheckboxGroup对象 1,新建空的EOS6.5的工程,新建com.towngas.tcis. gridlock构件包: 2,在com.towngas.tcis.gridlock构件包的"展现"节点下的"页面资源"节点中创建

可导出窗体和背景的报表控件QuickReport

QuickReport 是一个100% 用Delphi 代码编写的分栏报表生成器控件,它可与Delphi 和C++Builder 完美整合,并且Delphi/C++Builder IDE 中使用表单设计器作为报表设计器来设计报表. 具体功能: 报表设计:QuickReport 是一个用Delphi 编写的分栏报表生成器.可与Delphi 和C++Builder 完美整合,在Delphi/C++Builder IDE 中使用表单设计器作为报表设计器来设计报表. 数据连接:Quickreport 可

【6】页面数据和控件的自动交换机制

阅读目录 数据维护通用流程 数据的加载 数据的修改 数据的添加 自动交换机制 使用PageX来完成数据的自动加载 非标准数据的处理 只要使用了数据库,那么管理和维护数据的工作就是不可避免的.应用程序中,对于数据库中数据的管理和维护,有两种情况.一种是与业务逻辑密切相关的数据,往往通过关系-对象映射的方法转换为对象,应用程序的运行就围绕这些对象进行,所以这类数据的管理维护的过程其实就是应用程序的运行过程.另外一种,就是很多的资料性的数据,涉及到数据表和数据字段都很多,但使用频度不高.对于这类数据,

支持Word文档和其他文件格式间的转换的控件Spire.Doc for .NET

Spire.Doc for .NET是e-iceblue公司推出的一款专门对Microsoft Word 文档进行操作的.NET类控件.这款控件的主要功能在于帮助开发人员轻松快捷地生成.编辑和查看Word文档.同时,开发人员还可以通过使用Spire.Doc for .NET 设置Word文档的格式,插入图片,表格,超链接等.Spire.Doc for .NET 最大的便利之处在于它不依赖于Microsoft Word以及任何其他第三方软件.只需将此款控件安装在您的电脑上,您就可以对word文档进

.net 数据表格显示控件

1. GridView 控件 GridView 控件用于显示表中的数据.通过使用 GridView控件,您可以显示.编辑.删除.排序和翻阅多种不同的数据源(包括数据库.XML 文件和公开数据的业务对象)中的表格数据. 显示表格数据是软件开发中的一个周期性任务.ASP.NET 提供了许多工具来在网格中显示表格数据,例如 GridView 控件.通过使用GridView 控件,您可以显示.编辑和删除多种不同的数据源(例如数据库.XML 文件和公开数据的业务对象)中的数据. 可以使用 GridView