我正在使用gdal做一些栅格工作,它有一个GDALWarpAppOptionsSetProgress函数,它获取一个静态函数来显示它的进程。在这里你可以找到它的链接:http://www.gdal.org/gdal__utils_8h.html#a6ed3c9681cabcfcbd6fc87d427762482 和这个链接
http://gdal.sourcearchive.com/documentation/1.6.0/gdal_8h_5703b651695c0cbe6f3644a0a18dda8b.html
我知道我必须编写一个静态函数来使用它,这是我的函数
static int My_FN_GDALTermProgress( double dfComplete, const char *pszMessage, void *pData)
{
if(progressBar){
progressBar->setValue(FN_GDAL_PROGRESS_VALUE);
}
double FN_GDAL_PROGRESS_VALUE = dfComplete * 100;
return TRUE;
}
我有一个名为gdal_dem
的类,就像这样
#include "gdal_dem.h"
#include "gdal_wrap.h"
#include <qdebug.h>
#include <iostream>
#include "cpl_string.h"
#include "gdal_priv.h"
#include "ogr_spatialref.h"
#include "gdal_utils_priv.h"
#include "cpl_error.h"
#include <QString>
#include "commonutils.h"
#include <QFile>
gdal_dem::gdal_dem(QString SrcFilename):
SrcFile(SrcFilename)
{
}
float FN_GDAL_PROGRESS_VALUE = 0.0f;
static int My_FN_GDALTermProgress(double dfComplete,
CPL_UNUSED const char * pszMessage,
CPL_UNUSED void * pProgressArg )
{
FN_GDAL_PROGRESS_VALUE = dfComplete * 100;
printf("Progress: %f\n",FN_GDAL_PROGRESS_VALUE);
return true;
}
////
int gdal_dem::colorrelief(QString Dstanationfile,QString colorfile){
.....
if(!(psOptionsForBinary->bQuiet))
{
prgFunc=My_FN_GDALTermProgress;
GDALDEMProcessingOptionsSetProgress(psOptions, prgFunc,NULL);
}
......
}
在上面的代码中我可以在处理选项中设置上面提到的功能,它工作正常。但我的问题是当我想更新进度条时。我有一个QProgressBar
,它在我的主要课程中。如何将其传递给静态函数?我试过这些方法:
1-我试图在我的gdal_dem中获取进度条,并在gdal_dem
中定义了一个静态变量并尝试设置其值并在My_FN_GDALTermProgress
中更新它,问题是因为progressbar
也是静态的我可以在wrap.cpp的承包商中看到它,
2 - 我试图在我的主应用类中定义一个新的My_FN_GDALTermProgress
函数,但它必须是静态的,我遇到了这个错误cannot declare member function to have static linkage
3-我也试过这种方法,但它不起作用 https://www.badprog.com/c-errors-warnings-cannot-declare-member-function-static-void-myclassmymethod-to-have-static-linkage
那么,如何将参数传递给我的gdal_dem类并在其中的静态类中更新其值?
答案 0 :(得分:1)
使用pData
参数。注册静态函数时,您可以传递任何想要的内容。在这种情况下,您可以将指针传递给QProgressBar
对象:
QProgressBar* qProgBarObj = // ...
GDALDEMProcessingOptionsSetProgress(psOptions, prgFunc, qProgBarObj);
静态函数将接收它作为第三个参数:
static int My_FN_GDALTermProgress(double dfComplete, const char *pszMessage, void *pData)
{
auto progBar = reinterpret_cast<QProgressBar*>(pData);
progBar->setValue(/* ... */);
// ...
}