QT基础练习

本文详细介绍了Qt中的信号槽机制,包括自动关联和手动连接槽函数,以及如何在UI设计中处理控件间的交互。还涉及了串口编程、网络编程(TCP/UDP)和定时器的使用,以及系统移植和交叉编译的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

槽函数

 connect(ui>logoBt,SIGNAL(clicked()),this,SLOT(logoBt_clicked_slots()));
 ​
 connect(A,SIGNAL(B),C,SLOT(D));
 ​
 当对象A发出B信号时候,就会触发对象C的槽函数D

qt基础

做一个简单的qt界面

如何创建一个QT工程?

步骤一:

步骤二:

不要有中文路径

步骤三:

工程文件分析:

点击forms,然后双击ui文件,就可以进入ui编辑器。

ui编辑器面板介绍:

做一个简单的QQ登录界面

我们用到组件

放图片,放文本,放gif图的组件就是qlabel。

放账号和密码的对话框我们用的组件是qlinedit。

按钮我们使用的组件是qpushbutton

怎么关联信号和槽

自动关联:在ui界面里,右键点击对应的控件->转到槽

第一个部分: 自动关联会给我们的工程添加以下内容:

槽函数只能声明到private slots或者public slots 下面。(QT特有)

第二个部分:

手动关联:使用connect这个函数。

 connect(ui>logoBt,SIGNAL(clicked()),this,SLOT(logoBt_clicked_slots()));
 ​
 connect(A,SIGNAL(B),C,SLOT(D));
 ​
 当对象A发出B信号时候,就会触发对象C的槽函数D

写一个界面

图标下载网址: iconfont-阿里巴巴矢量图标库

1、添加图片:

  • 右键项目名->添加新文件->Qt->Qt Resource File

  • Resourrces文件夹下右键.qrc文件->Open with>资源编辑器-添加前缀(一般默认根文件)->Crtl+S 保存文件->添加文件 注意:记得保存!!!

2、引用图片

  • 右击想要的控件->改变样式表->添加资源->border-image。可以添加多张照片。

添加新的界面:

  1. 右键项目名-》添加新文件-》Qt-》Qt 设计师类界面-》设置类名

  2. 26、28行,创建类的对象。问题:在这个类下随意创建一个对象就是我们在编辑的ui界面吗???

效果图:

qt 的三驾马车

1.qt 下的串口编程

2.qt 下的网络编程

3.qt 下操作 GPIO

想要在开发板上运行:

交叉编译Qt源码->生成Qt库->移植到开发板上

左下角这一块最好先栅格布局,然后和右边水平布局

实现串口功能

1.编辑工程文件(后缀为 .pro 的文件) 在 QT += core gui 后添加 serialport。

2.自动获取串口 使用 QSerialPortInfo:::availablePorts()获取当前串口, 该函数返回容器类Qlist<QSerialPortInfo>, 用 Qt 定义的关键字 foreach 遍历容器 Qlist 里的串口信息, 并将串口信息放到 QStringList 的类对象 serialNamePort,显示到 ui 的串口组件。

打开串口功能和属性设置 步骤一: 实例化串口类 QSerialPort 对象 serialPort, 对串口的操作就是对 serialPort 对象的操作

问题:.h文件18行,.cpp文件13行。为什么这么写2次。

注意:修改.exe文件图标使,不能偷懒直接把图片的后缀改成.ico文件,会报错

网络编程

客户端用到QTcpSocket。服务端用到QTcpServer 和 QTcpSocket。

在.h文件中:

 QTcpServer * tcpServer;
 QTcpSocket * tcpSocket;  

创建指针形式,是为了申请栈空间、因为new出来的是指针类型(弹幕)

在cpp文件中:

 tcpServer = new QTcpServer(this);
 tcpSocket = new QTcpSocket(this);

其中this可忽略。

注意:接收窗口和接收框先垂直布局,比较好看。发送窗口同理。

问题:

 void Widget::on_sendPb_clicked()
 {
     tcpsocket->write(ui->sendEdit->text().toLocal8Bit().data());//和串口实验类似,转换成char*类型?
 }

实现效果:

注意:

  • 服务器和客户端的端口要一致

  • ipconfig显示多个ip地址时,有默认网关的那个是本机ip。

UDP通信

 udpSocket = new QUdpSocket(this);//this表示父对象被删除时,子对象也被删除。


 QByteArray array;
 //hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取。即没读取完时返回true
 while(udpSocket->hasPendingDatagrams()){
 //获取数据
 array.resize(udpSocket->pendingDatagramSize());//将数组大小调整为跟udp剩下的一样。
 udpSocket->readDatagram(array.data(),array.size());
 buf = array.data();
 ui->recvEdit->appendPlainText(buf);
 }  

时钟

 connect(&timer,SIGNAL(timeout()),this,SLOT(timeOut_Slot()));  //传个地址过去,用的内存还是刚刚定义的内存,这样可以节省空间

除显示时钟和timeout_slot()触发函数中使用time,其他地方都用定时器timer。

//每隔50ms触发一次定时器,使time时钟每次增加50ms
 ​
 void Widget::timeout_slot()
 {
     time = time.addMSecs(50);
 ​
     ui->showTime->setText(time.toString("hh:mm:ss.zzz"));
 }
 ​
 void Widget::on_openPb_clicked()
 {
     timer.start(50);//每50ms触发一次信号
 }
 ​

系统移植-构建根文件系统

因为用ULL开发板演示,所以要打包成.tar.bz2形式。

 tar -cjf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc sbin sys tmp usr var

交叉编译QT源码

交叉编译:在Ubuntu编译好,送给另外一个平台使用。要想在开发板上使用,要先交叉编译QT源码,生成QT库,再移植到开发板上使用。(以上步骤在Ubuntu中完成)

用file命令查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值