Функция-член как слот 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 );

}

Вот .cpp графического интерфейса (созданного с помощью Qt Designer):

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

ui->setupUi(this);


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

}

Я получаю сообщение об ошибке «не объявлено в этой области» для MoyenEtMedian даже при прямой передаче.

ОБНОВЛЕНИЕ: отсутствовал #include. Проблема «не объявлена ​​в этой области» решена.

Но у меня другой:

«ожидаемое первичное выражение перед токеном», касающееся:

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

Я объявил SLOT в файле moyenetmedian.h:

 #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

person El-Hadj Chikhaoui    schedule 10.12.2012    source источник
comment
Третий параметр для подключения должен быть указателем на класс приемника. Также я не думаю, что вам нужно использовать имя класса внутри макроса SLOT.   -  person dowhilefor    schedule 10.12.2012


Ответы (2)


До Qt 5.0 назначение соединения должно быть объявлено как SLOT в объявлении класса.

Qt 5.0 представил новый синтаксис для соединения. Один из них позволяет подключить сигнал к любой функции-члену: http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#connect-4

person Stephen Chu    schedule 10.12.2012

Вам нужно создать объект 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 - это класс, а не объект.

person Kirween    schedule 10.12.2012
comment
Я сделал это и получил новые ошибки: запрошено преобразование из «MoyenEtMedian*» в нескалярный тип «MoyenEtMedian» и нет соответствующей функции для вызова «FenPrincipale::connect(QPushButton*&, const char [11], MoyenEtMedian&, константный символ [8])' - person El-Hadj Chikhaoui; 10.12.2012
comment
moyenEtMedian = new MoyenEtMedian(); — это ошибка, должно быть moyenEtMedian = new MoyenEtMedian; stackoverflow.com/questions /180172/ - person Martin Beckett; 10.12.2012
comment
Вы должны объявить в объявлении класса FenPrincipale свой член следующим образом: MoyenEtMedian *moyenEtMedian; - person Kirween; 11.12.2012
comment
Добавьте этот class MoyenEtMedian; перед объявлением класса FenPrincipale (файл .h). - person Kirween; 11.12.2012