我正在使用 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 类并在其中的静态类中更新其值?
使用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(/* ... */);
// ...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句