1.踩坑:已解决
qt5 添加multimedia包 cmake编译错误_lx37213721的博客-CSDN博客
2.qnode类和mainWindow类中的信息如何传递?
qnode类中接收订阅话题,如果mainWindow类中需要访问qnode话题所携带的信号,则需要在qnode.hpp中定义一个信号,
Q_SIGNALS:
void loggingUpdated();
void rosShutdown();
void speed_vel(float,float);在qnode里的回调函数里发送信号:
void QNode::odom_callback(const nav_msgs::Odometry &msg)
{
emit speed_vel(msg.twist.twist.linear.x,msg.twist.twist.linear.y);
}mainWindow类中连接:
connect(&qnode,SIGNAL(speed_vel(float,float)),this,SLOT(slot_update_dashboard(float,float)));接受者this是当前对象。
mainWindow中对槽函数进行定义:
void MainWindow::slot_update_dashboard(float x,float y)
{
ui.label_dir_x->setText(x>0?"正向":"反向");
ui.label_dir_y->setText(y>0?"正向":"反向");
speed_x_dashBoard->setValue(abs(x)*100);
speed_y_dashBoard->setValue(abs(y)*100);
}3.电池电量的显示与实现
概览:
订阅电量话题、回调函数中发布自定义信号、连接信号、槽函数更新ui显示
rostopic echo power
电池电压的数据类型:
#include <std_msgs/Float32.h>步骤:
qnode.hpp中:
ros::Subscriber power_sub;
void power_callback(const std_msgs::Float32 &msg);
Q_SIGNALS:
void power_vel(float);
qnode.cpp中:
power_sub=n.subscribe("power",1000,&QNode::power_callback,this);
void QNode::power_callback(const std_msgs::Float32 &msg)
{
emit power_vel(msg.data);
}
MainWindow.cpp链接这个信号:
connect(&qnode,SIGNAL(power_vel(float)),this,SLOT(slot_update_power(float)));
槽函数:
void MainWindow::slot_update_power(float value)
{
ui.label_power_val->setText(QString::number(value).mid(0,5)+"V");
double n=(value-10.5)/(12.5-10.5);
int val=n*100;
ui.progressBar->setValue(val);
}
4.运行终端命令实现快捷指令:

#include <QProcess>
connect(ui.laser_btn,SIGNAL(clicked()),this,SLOT(slot_quick_cmd_clicked()));
void MainWindow::slot_quick_cmd_clicked()
{
laser_cmd=new QProcess;
//运行系统的一些命令
laser_cmd->start("bash");
//反斜杠符代表执行命令的结束
laser_cmd->write(ui.textEdit_laser_cmd->toPlainText().toLocal8Bit()+'\n');
//接收到错误的输入信息的话,会发送此信号,响应输出
connect(laser_cmd,SIGNAL(readyReadStandardError()),this,SLOT(slot_quick_output()));
//正常的输出回显
connect(laser_cmd,SIGNAL(readyReadStandardOutput()),this,SLOT(slot_quick_output()));
}
//槽函数:slot_quick_output()
void MainWindow::slot_quick_output()
{
ui.textEdit_quick_output->append("<font color=\"#FF0000\">"+laser_cmd->readAllStandardError()+"</font>");
ui.textEdit_quick_output->append("<font color=\"#FFFFFF\">"+laser_cmd->readAllStandardOutput()+"</font>");
}
之后在文本框内输入命令即可:
参考阅读:

5.订阅图像话题并在界面显示:


因为在qnode类中订阅,所以将头文件包含在qnode.hpp中。
checkbox在订阅前指定话题,点击按钮订阅,改变样式表(QSS)加边框。


因为在qnode中点击订阅按钮才进行订阅显示,所以在qnode中创建一个接口函数,
(1)qnode.hpp中:
void sub_image(QString topic_name);
Q_SIGNALS:
void image_val(QImage);
(2)qnode.cpp中:
void QNode::sub_image(QString topic_name)
{
ros::NodeHandle n;
//新建一个图像话题的句柄
image_transport::ImageTransport it_(n);
//Qstring类型转成stdString类型
image_sub=it_.subscribe(topic_name.toStdString(),1000,&QNode::image_callback,this);
}
void QNode::image_callback(const sensor_msgs::ImageConstPtr &msg)
{
cv_bridge::CvImagePtr cv_ptr;
cv_ptr=cv_bridge::toCvCopy(msg,msg->encoding);
QImage im=Mat2QImage(cv_ptr->image);
emit image_val(im);
}
(3)MainWindow.cpp中:
connect(ui.pushButton_sub_image,SIGNAL(clicked()),this,SLOT(slot_sub_image()));
connect(&qnode,SIGNAL(image_val(QImage)),this,SLOT(slot_update_image(QImage)));
void MainWindow::slot_sub_image()
{
qnode.sub_image(ui.lineEdit_image_topic->text());
}
void MainWindow::slot_update_image(QImage im)
{
ui.label_image->setPixmap(QPixmap::fromImage(im));
}
执行流程:
点击按钮后,进入槽函数slot_sub_image(),在其中订阅图像话题(传入图像话题参数),进去qnode类中,并且进入回调函数,图像的回调函数中,进行图像类型的转换,并发送图像信号,mainWindow类中接收到图像信号后,进入槽函数slot_update_image();并更新显示图像(用Qpixmap);
执行结果:

版权声明:本文为yoga_wyj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。