2012-12-10 46 views
1

我需要将按钮连接到另一个类的成员函数。在这里,类的代码:作为Qt插槽的成员函数

int g_switch_value = 0; 
int filterInt = 0; 
int lastfilterInt = -1; 

void MoyenEtMedian::switch_callback(int position, void* object) 
{ MoyenEtMedian* moyetmed = (MoyenEtMedian*) object; 
    filterInt = position; 
} 

void MoyenEtMedian::exec(void) 
{ 
    const char* name = "Filtres"; 
    IplImage* img = cvLoadImage("image.png"); 
    IplImage* out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); 
    cvNamedWindow(name, 1); 
    cvShowImage(name, out); 

    // Create trackbar 
    cvCreateTrackbar2("Filtre", name, &g_switch_value, 1, &MoyenEtMedian::switch_callback, this); 

    while(1) { 
     switch(filterInt){ 
      case 0: 
       cvSmooth(img, out, CV_BLUR, 7, 7); 
       break; 
      case 1: 
       cvSmooth(img, out, CV_MEDIAN, 7, 7); 
       break; 
        } 
     if(filterInt != lastfilterInt){ 
      cvShowImage(name, out); 
      lastfilterInt = filterInt; 
     } 
     if(cvWaitKey(15) == 27) 
      break; 
    } 

    cvReleaseImage(&img); 
    cvReleaseImage(&out); 
    cvDestroyWindow(name); 

}

这里的GUI的(使用Qt Designer创建)在.cpp:

FenPrincipale::FenPrincipale(QWidget *parent) : 
QWidget(parent), 
ui(new Ui::FenPrincipale) 
{ 

ui->setupUi(this); 


QObject::connect(ui->bMoyMed,SIGNAL(clicked()),MoyenEtMedian,SLOT(MoyenEtMedian::exec())); 

} 

我得到了“不在此范围declard “MoyenEtMedian错误,即使直接传递。

UPDATE:#include missing。 “未在此范围内声明”问题已解决。

不过,我还有一个:

“之前预期主表达式 '' 令牌” 有关:

QObject::connect(ui->bMoyMed,SIGNAL(clicked()),MoyenEtMedian,SLOT(exec())); 

我已经宣布在moyenetmedian.h文件SLOT:

#ifndef MOYENETMEDIAN_H 
#define MOYENETMEDIAN_H 
#include "ui_fenprincipale.h" 

class MoyenEtMedian 
{Q_OBJECT 
    public: 
MoyenEtMedian(); 
static void switch_callback(int position, void*); 

public slots : 
void exec(void); 

}; 

#endif // MOYENETMEDIAN_H 
+0

连接的第三个参数应该是指向接收器类的指针。另外我不认为你需要在SLOT宏中使用类名。 – dowhilefor

回答

1

你需要创建一个对象MoyenEtMedian这里FenPrincipale成员的样本(或者你可以通过你的对象作为参数传递给FenPrincipale构造器,如果它已经创建)。

FenPrincipale::FenPrincipale(QWidget *parent) : 
     QWidget(parent), 
     ui(new Ui::FenPrincipale) 
{ 
    ui->setupUi(this); 
    moyenEtMedian = new MoyenEtMedian(); 
    QObject::connect(ui->bMoyMed,SIGNAL(clicked()), moyenEtMedian, SLOT(exec())); 
} 

在您的代码中MoyenEtMedian是一个类而不是对象。

+0

我做了这个,我得到了新的错误:“从'MoyenEtMedian *'转换为非标量类型'MoyenEtMedian'请求”和“没有匹配函数调用'FenPrincipale :: connect(QPushButton *&,const char [11 ],MoyenEtMedian&,const char [8])'' –

+0

'moyenEtMedian = new MoyenEtMedian();'是错误,应该是'moyenEtMedian = new MoyenEtMedian;'http://stackoverflow.com/questions/180172/default-constructor -with-empty-brackets –

+0

你必须在'FenPrincipale'类声明中声明你的成员是这样的:'MoyenEtMedian * moyenEtMedian;' – Kirween