我正在使用GPS接收器,它将使用像这样的C ++程序在终端中连续打印GPS消息
Latitude:13.3 Longitude:80.25
Latitude:13.4 Longitude:80.27
Latitude:13.5 Longitude:80.28
我想把这些数据放在我的c ++程序(QT应用程序)
中以下是我的完整程序代码
void QgsGpsPlotPluginGui::on_buttonBox_accepted()
{
QString myPluginsDir = "usr/lib/qgis/plugins";
QgsProviderRegistry::instance(myPluginsDir);
QgsVectorLayer * mypLayer = new QgsVectorLayer("/home/mit/Documents/Dwl/GIS DataBase/india_placename.shp","GPS","ogr");
QgsSingleSymbolRenderer *mypRenderer = new
QgsSingleSymbolRenderer(mypLayer->geometryType());
QList <QgsMapCanvasLayer> myLayerSet;
mypLayer->setRenderer(mypRenderer);
if (mypLayer->isValid())
{
qDebug("Layer is valid");
}
else
{
qDebug("Layer is NOT valid");
}
// Add the Vector Layer to the Layer Registry
QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, TRUE);
// Add the Layer to the Layer Set
myLayerSet.append(QgsMapCanvasLayer(mypLayer, TRUE));
QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(0, 0);
mypMapCanvas->setExtent(mypLayer->extent());
mypMapCanvas->enableAntiAliasing(true);
mypMapCanvas->setCanvasColor(QColor(255, 255, 255));
mypMapCanvas->freeze(false);
QgsFeature * mFeature = new QgsFeature();
QgsGeometry * geom = QgsGeometry::fromPoint(*p);
QGis::GeometryType geometryType=QGis::Point;
QgsRubberBand * mrub = new QgsRubberBand (mypMapCanvas,geometryType);
QgsPoint * p = new QgsPoint();
double latitude =13.3;
double longitude = 80.25;
p->setX(latitude);
p->setY(longitude);
mrub->setToGeometry(geom,mypLayer);
mrub->show()
}
在上面的代码中,我手动输入了纬度和经度值,如下所示,
double latitude =13.3;
double longitude = 80.25;
p->setX(latitude);
p->setY(longitude);
但我需要从终端获取这些价值。
这两个程序都是用c ++编写的,但它们属于不同的框架。
答案 0 :(得分:2)
我认为您的图书馆没有可以使用的API。 然后,一个相当直接的方法来集成它们将是使用管道。 您可以快速执行类似
的操作gps_program | qt_program
现在你通过stdin获得坐标。
更复杂的设置方法是使用exec和fork。您创建管道对象,然后使用exec gps_programon分支并运行其中一个分支。这可以完全在你的代码中完成,而不依赖于bash或类似的东西。您仍然需要以相同的方式解析来自管道的数据。
答案 1 :(得分:0)
只需创建一个管道:
#include <cstdio>
#include <iostream>
#define WWRITER 0
#if WWRITER
int main() {
while (true) {
std::cout << "Latitude:13.3 Longitude:80.25";
}
return 0;
}
#else
int main() {
FILE* fp = popen("Debug/Writer", "r");
if(fp == 0) perror(0);
else {
const std::size_t LatitudeLength = 9;
const std::size_t LongitudeLength = 10;
char latitude_name[LatitudeLength+1];
char longitude_name[LongitudeLength+1];
double latitude;
double longitude;
while(fscanf(fp, "%9s%lf%10s%lf",
latitude_name,
&latitude,
longitude_name,
&longitude) == 4)
{
std::cout << "Values: " << latitude << ", " << longitude << std::endl;
}
pclose(fp);
}
return 0;
}
#endif
注意:该示例无休止地运行。
答案 2 :(得分:0)
+1索林的回答,让这很好,很容易将stdout传递给stdin :)但假设你在linux / cigwin中运行?
但是如果你可以访问这两个程序代码,那么一个更好的解决方案是使用UdpSockets(或者可能是Tcp,但Udp更简单)并以这种方式在程序之间传递数据......不确定有多大/长期你的解决方案需要,但如果你想以“长期”和更可维护的方式整合它们,这将是一个更好的方法。