Qt系列——Win10下LCM通讯库在Qt中的使用及问题解决
1. 说明
在windows10下Qt使用Lcm通讯库,以及数据传输测试,运行界面如下:
1)发送端:
2)接收端:
2. 主要代码段
1)发送端
void MainWindow::on_btn_select_clicked()
{
QString path = QFileDialog::getOpenFileName(this, "选择 img", "./", "Image Files(*.jpg *.png *.jpeg)");
if(path.isEmpty())
{
return;
}
QImage scaledimg;
if(!(img.load(path))) //加载图像
{
QMessageBox::information(this,"failed","failed open image !");
return;
}
img=img.convertToFormat(QImage::Format_RGB888);
src_width=img.width();
src_height=img.height();
int scal_width=0;
int scal_height=0;
QString str_width,str_heigth;
QRect originRect = ui->label_image->geometry();
ui->label_image->setGeometry(originRect.x(),originRect.y(),400,300);
int Mul=1;
if(src_width/400>=src_height/300)
{
Mul=src_width/400;
}
else
{
Mul=src_height/300;
}
if(Mul>0)
{
scal_width=src_width/Mul;
scal_height=src_height/Mul;
}
else
{
scal_width=src_width;
scal_height=src_height;
}
scaledimg=img.scaled(scal_width,scal_height,Qt::KeepAspectRatio);
ui->label_text->setText("src image: "+QString("width: ")+str_width.setNum(src_width)+QString(", height: ")+str_heigth.setNum(src_height));
ui->label_image->setPixmap(QPixmap::fromImage(scaledimg));
}
void MainWindow::on_btn_send_clicked()
{
//lcm feed msg
if(!mylcm.good())
{
QMessageBox::information(this,"lcm","lcm is not good!");
return;
}
qint64 timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch();
std::string str_image_name;
str_image_name=ui->lineEdit_image_name->text().toStdString();
std::string str_channel_name;
str_channel_name=ui->lineEdit_channel_name->text().toStdString();
exlcm::test msg;
msg.timestamp=timestamp;
msg.position[0]=src_width;
msg.position[1]=src_height;
msg.position[2]=3;
msg.orientation[0]=0;
msg.orientation[1]=0;
msg.orientation[2]=0;
msg.orientation[3]=1;
msg.num_datas=img.sizeInBytes();
msg.datas.resize(msg.num_datas);
memcpy(&msg.datas[0], img.bits(), msg.num_datas*sizeof (uchar));
msg.name=str_image_name;
msg.enabled=true;
int rt = mylcm.publish(str_channel_name,&msg);
//QMessageBox::information(this,"lcm pub",rt==0?"success":"failure");
if(rt==0)
{
ui->textBrowser->append("timestamp:"+QString::number(timestamp)+" ---- success contens: channel name( "+QString::fromStdString(str_channel_name)+" ),"+
"image size: "+QString::number(src_width) + "*"+QString::number(src_height));
}
else
{
ui->textBrowser->append("timestamp:"+QString::number(timestamp)+" ---- failure contens: channel name( "+QString::fromStdString(str_channel_name)+" ),"+
"image size: "+QString::number(src_width) + "*"+QString::number(src_height));
}
}
2)接收端
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, mylcm("udpm://239.255.76.67:7667?ttl=1")
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btn_receive_clicked()
{
QMessageBox::information(this,"btn_receive","start receive data!");
if(!mylcm.good())
{
return;
}
mylcm.subscribe("TEST", &Handler::handleMessage, &myhandler);
if(mylcm.handle() == 0)
{
uchar *datas = new uchar[myhandler.image_data.num_datas*sizeof (uchar)];
memcpy(datas, &myhandler.image_data.datas[0],myhandler.image_data.num_datas*sizeof(uchar));
QImage img(datas,myhandler.image_data.position[0],myhandler.image_data.position[1], QImage::Format_RGB888);
std::string file_name = std::to_string(myhandler.image_data.timestamp)+".jpeg";
//img.save(file_name.c_str(),"JPEG");
QRect originRect = ui->label_image->geometry();
ui->label_image->setGeometry(originRect.x(),originRect.y(),400,300);
int ratio = 1;
int src_width = myhandler.image_data.position[0];
int src_height = myhandler.image_data.position[1];
int scal_width,scal_height;
if(src_width/400 >= src_height/300)
{
ratio = src_width/400;
}
else
{
ratio = src_height/300;
}
if(ratio > 0)
{
scal_width=src_width/ratio;
scal_height=src_height/ratio;
}
else
{
scal_width=src_width;
scal_height=src_height;
}
QImage scaledimg;
scaledimg=img.scaled(scal_width,scal_height,Qt::KeepAspectRatio);
QString str_width,str_heigth;
ui->label_text->setText("receive image: "+QString("width: ")+str_width.setNum(src_width)+QString(", height: ")+str_heigth.setNum(src_height));
ui->label_image->setPixmap(QPixmap::fromImage(scaledimg));
delete [] datas;
}
return;
}
3. 问题及解决
1)问题
mainwindow.obj: -1: error: LNK2019: 无法解析的外部符号 __imp__lcm_create,函数 “public: __thiscall lcm::LCM::LCM(class std::basic_string<char,struct std::char_traits,class std::allocator >)” (??0LCM@lcm@@QAE@V?
b
a
s
i
c
s
t
r
i
n
g
@
D
U
?
basic_string@DU?
basicstring@DU?char_traits@D@std@@V?KaTeX parse error: Expected group after ‘_’ at position 78: …019: 无法解析的外部符号 _̲_imp__lcm_destr…basic_string@DU?
c
h
a
r
t
r
a
i
t
s
@
D
@
s
t
d
@
@
V
?
char_traits@D@std@@V?
chartraits@D@std@@V?allocator@D@2@@std@@PBXI@Z) 中引用了该符号
解决:
2).pro文件
3)发送端
4)接收端
运行出现如下错误:
GLib-ERROR **: The thread system is not yet initialized.
aborting…
解决:
把其他几个库放到项目目录下,如下图
4. 代码中用到的库文件下载
建议自己安装配置好LCM库,尽量不要直接下载我的上传!
库文件下载
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130114.html