目录
前言
因为是随做随找随学,所以想到什么,做到什么就讲什么,如果有别的需要可以根据下文类推。这次是使用QTimer,应该算是挺常用的一个库了,用法也很多。
这次用到的原因是手册要求控制指令必须要以0.1s以内的间隔发出,以达到实时控制的目的。另外还有一个功能,实时显示所在坐标。其实说白了都一样,就是短时间内向下位机连续发送指令。
1.引用QTimer库
这里不用太多说,.h文件中里添加头文件。(这个库应该是含在Qt core里面的,所以应该不用手动添加Qt Modules了)
#include <QTimer>
2.基本指令
QTimer timer; //.h文件里写
两种使用方法,效果是一样的。数字的地方是间隔,单位是毫秒。1000就是1秒,这里50就是0.05秒。手册要求0.1秒以内就行,如果卡在0.1,秒的话,因为传输和连接这些问题,系统运行会一顿一顿的。(说白了就是指令没连上)
timer.setInterval(50);
timer.start();
timer.start(50);
当然具体设置多少要看实际需求,太慢不满足条件,太快的话小心把下位机爆了。
当然别忘了停止计时器。
timer.stop();
3.实现定时发送功能
如果你希望系统启动的时候就启动计时器,开始实现计时器绑定的功能,可以直接写在主类里。
GetAxis::GetAxis(QObject *parent)
: QObject(parent)
{
timer.setInterval(100);
connect(&计时器名称, &QTimer::timeout, this, &类名::槽函数方法名);
timer.start();
}
timer的触发实际上是通过自带的timeout,假如我设定为100毫秒。那么就是每0.1秒触发一次timeout,然后开始下一次计时。当触发timeout时,我们把这个作为信号,去建立与槽函数的连接,从而实现自动的连续发送。
4.按钮实时控制方向
实际上最开始使用QTimer不是用于这种指令发送,而是用于QButton的持续按下,从而实现实时移动。下面来讲一下这个。
首先UI上创建一个QButton控件,因为是持续按下和抬起,所以用到的信号是pressed()和released()。同时创建两种方法,一个timerStart用于按下按钮时开启定时器,一个timerStop用于抬起按钮时关闭定时器。
connect(ui.UpBtn, SIGNAL(pressed()), 类名, SLOT(timerStart()));
connect(ui.UpBtn, SIGNAL(released()), 类名, SLOT(timerStop()));
timerStart函数:
void JogControl::timerStart() {
timer.setInterval(50);
//获取发送信号控件
QPushButton* senderBtn = qobject_cast<QPushButton*>(sender());
timer.start();
//判断控件发出指令
if (senderBtn->objectName() == "UpBtn") {
connect(&timer, &QTimer::timeout, this, &JogControl::upControl);
}
}
如果是一个按钮那就无所谓了,这里因为实现的是一个四方向控制,都要引入到timerStart函数中。所以增加了一步判断发送信号的sender,根据sender的名称,再去使用不同的功能。
timerStop函数:
void JogControl::timerStop() {
timer.stop();
disconnect(&timer, &QTimer::timeout, this, &JogControl::upControl);
disconnect(&timer, &QTimer::timeout, this, &JogControl::downControl);
disconnect(&timer, &QTimer::timeout, this, &JogControl::leftControl);
disconnect(&timer, &QTimer::timeout, this, &JogControl::rightControl);
}
这里还是注意一下哈,需要手动断开连接。 不然你会发现你按完的按钮还在跟着别的按钮一起触发,我这里之前就犯了这个错。