电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
QT界面之间的数据传递
分 享
扫描二维码分享
QT界面之间的数据传递
linux
Qt
交叉编译
大斯
关注
发布时间: 2020-06-03
丨
阅读: 1424
# 前言 如果想要完成一个比较系统的QT界面,那数据的传递肯定必不可少,比如说简单一点的学生管理系统,当你在某个页面选择添加学生信息时,其他的界面肯定要同步的添加此条信息。这个并不复杂,其实就是用到了最简单的信号和槽机制。 # 信号和槽 在前面的QT基础知识里面简单说了一下信号和槽的工作机制,很容易理解,当某个对象改动其状态时,信号就由该对象发射(emit)出去,这个就是对象要做的全部事情,它不需要知道另一端是谁在接收信号。而一个槽也不知道是否有很多信号和自己相连接,所以,你可以将很多信号和单个槽进行相连,也可以单个信号和很多槽相连,总之,十分灵活! # 连接 ![](https://cf03.ickimg.com/bbsimages/202006/3f50ce2622a2604ee04092ecc12097bf.png) QT信号和槽的连接方式也不止一种,你可以通过代码,也可以通过设计模式关联。 ### - 自动连接 你可以通过设计界面,点击控件选择go to slot。然后QT就会自动生成一个槽函数,一般这个名称为on_控件名称_clicked。如: ```cpp void Widget::on_TestButton_clicked() { close(); } ``` 注:TestButton控件实现摁下去关闭界面的功能 ### - 手动连接 一般我们在代码中常会用这种方式,因为它更灵活。使用函数connect(),它的参数就不说了。需要注意的是qt4和qt5中connect的用法不同。 qt4中的槽函数必须有slots关键字,而qt5中的槽可以是任意的成员函数,普通全局函数和静态函数,我习惯是还会比较喜欢用slots关键字。 ```cpp connect(TestButton,SIGNAL(clicked()),this,SLOTS(a())); void a() { close(); } ``` ### - 设计模式连接 ![](https://cf03.ickimg.com/bbsimages/202006/a4e8ed2ff4ab3222cdf183bb31a172cb.png) # 软件设计 - 软件:qtcreate - 平台:虚拟机或者ARM平台 首先大家先做一下准备工作,建立一个工程,添加子文件,添加界面。如下图: ![](https://cf03.ickimg.com/bbsimages/202006/6bef7591723305853d8a3a2d3855554d.png) 这里用了pri文件,如果是小型系统的话,肯定不能把所有的.c和.h文件堆在一个文件夹中。所以我这里分成了两个文件夹。pri文件使用起来也很简单,只需要在pro文件中包含即可,比如a文件夹,pro文件中include (./a/a.pri)就行了。刷新就会自动把pri文件夹包含进来。大家只是测试练习的话不用这么麻烦,直接添加两个界面文件就行。 然后在a、b两个界面添加控件。 ![](https://cf03.ickimg.com/bbsimages/202006/ff13761f14eef8704e2191974d816786.png) ![](https://cf03.ickimg.com/bbsimages/202006/560b242ab46ad69d418959139885f9e2.png) 然后开始写代码吧,发射界面很简单,只需要添加信号发射函数,使点击发射按钮时,数据可以发送出去。这里用了自动连接方式。 ```cpp #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); } Dialog::~Dialog() { delete ui; } void Dialog::on_pushButton_clicked() { QString str = ui->lineEdit->text(); emit getStr(str); } ``` 这个就是发射界面做的全部工作了,再看一下接收界面。也就是我们的主界面,控件包括打开按钮、接收按钮和接收区域,也是将信号和槽连接起来,通过connect函数,大家可以练习一下这几种连接方式,运行结果都是一样的。 ```cpp #include "uidemo.h" #include "ui_uidemo.h" UIdemo::UIdemo(QWidget *parent) : QWidget(parent), ui(new Ui::UIdemo) { ui->setupUi(this); dialog = new Dialog(); connect(dialog,SIGNAL(getStr(QString&)), this, SLOT(setStr(QString&))); } UIdemo::~UIdemo() { delete ui; } void UIdemo::on_pushButton_2_clicked() { dialog->show(); } void UIdemo::setStr(QString &str) { ui->lineEdit->setText(str); } ``` **注:->符号在代码中会变成** ```cpp -> ``` 运行结果如下所示: ![](https://cf03.ickimg.com/bbsimages/202006/630e7b9b5acf610dbf1feec96ece5f32.png) # 总结 过程很简单,但是可以运用的地方还是很广泛滴。尤其是一些小型的系统啊,数据的传输就是运用了信号和槽的工作原理。因为代码太简单了。所以就不放工程链接了,大家感兴趣的自己试一下吧!
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
大斯
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交