2012-12-10 83 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