槽函数
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。可以添加多张照片。
添加新的界面:
-
右键项目名-》添加新文件-》Qt-》Qt 设计师类界面-》设置类名
-
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命令查看