2012-10-21 14 views
6

是否可以创建一些滑块并对它们进行一次回调?带有一个回调的许多滑块

我正在创建一个窗口,其中我想设置约10个参数。对于它们而不是10个函数,有1个回调函数会更好。

目前我创建的TrackBar是这样的:

cvCreateTrackbar("Var1","Window",&global_var1, 250, changing_var1); 
cvCreateTrackbar("Var2","Window",&global_var2, 250, changing_var2); 

然后

void changing_var1(int pos) { 
    global_var1 = pos; 
}  

void changing_var2(int pos) { 
    global_var2 = pos; 
} 

是否有可能创建一个回调,这将是ALBE根据我想改变其参数更改所有参数?

+1

没有必要与价值分配全局变量。该函数已经把值放在global_var1中,这就是为什么它需要指针。 – shanif

回答

3

是的,你应该可以做到这一点(至少在C++接口中)。您将需要使用可选的userData字段。下面是你如何能做到这一点的一个小例子:

#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 

struct ColorThresholdData 
{ 
    int redHigh; 
    int redLow; 
}; 

enum ColorThresholdType 
{ 
    RED_HIGH, 
    RED_LOW 
}; 

void fooCallback(int value, void* colorThreshold); 

struct ColorThresholdData data; 
int main(int argc, char** argv) 
{ 
    ... 
    createTrackbar("red high", windowName, NULL, 255, fooCallback, new ColorThresholdType(RED_HIGH)); 
    createTrackbar("red low", windowName, NULL, 255, fooCallback, new ColorThresholdType(RED_LOW)); 
    ... 
} 

void fooCallback(int value, void* colorThreshold) 
{ 
    ColorThresholdType* ct = reinterpret_cast<ColorThresholdType*>(colorThreshold); 
    switch(*ct) 
    { 
    case RED_HIGH: 
     cout << "Got RED_HIGH value" << endl; 
     data.redHigh = value; 
     break; 
    case RED_LOW: 
     cout << "Got RED_LOW value" << endl; 
     data.redLow = value; 
     break; 
    } 
} 

希望这就是你要找的人:)