2012-10-21 35 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

हां, आपको यह करने में सक्षम होना चाहिए (कम से कम सी ++ इंटरफ़ेस के साथ)। आप वैकल्पिक 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; 
    } 
} 

आशा है कि क्या आप मूल्यों के साथ वैश्विक चर निर्दिष्ट करने के लिए कोई जरूरत नहीं है :)