Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
成员函数作为Qt插槽_Qt_Function_Connect_Member_Slot - Fatal编程技术网

成员函数作为Qt插槽

成员函数作为Qt插槽,qt,function,connect,member,slot,Qt,Function,Connect,Member,Slot,我需要将一个按钮连接到另一个类的成员函数。下面是类的代码: 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; } voi

我需要将一个按钮连接到另一个类的成员函数。下面是类的代码:

 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的.cpp(使用Qt设计器创建):

我得到了MoyeNetMiddian的“未在此范围内声明”错误,即使直接传递它

更新:#缺少include。“未在此范围内声明”问题已解决

但我还有一个:

“应在”“标记”“之前使用主表达式”,涉及:

QObject::connect(ui->bMoyMed,SIGNAL(clicked()),MoyenEtMedian,SLOT(exec()));
我已在moyenetmedia.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

在Qt5.0之前,连接的目标必须在类声明中声明为插槽

Qt5.0为连接引入了一些新语法。其中之一允许您将信号连接到任何成员函数:

在Qt 5.0之前,连接的目标必须在类声明中声明为插槽

Qt5.0为连接引入了一些新语法。其中之一允许您将信号连接到任何成员函数:

您需要创建一个对象
MoyeNetMida
这里是一个带有
FenPrincipale
成员的示例(或者您可以将对象作为参数传递给
FenPrincipale
构造函数,如果它已经创建)


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

您需要创建一个对象
MoyenEtMedian
这里是一个带有
FenPrincipale
成员的示例(或者,如果已经创建了对象,您可以将对象作为参数传递给
FenPrincipale
构造函数)


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

要连接的第三个参数应该是指向receiver类的指针。另外,我认为不需要在SLOT宏中使用类名。要连接的第三个参数应该是指向receiver类的指针。另外,我认为您不需要在SLOT宏中使用类名。我这样做了,我得到了新的错误:“从'moyenetmedia*'转换为非标量类型'moyenetmedia'已请求”和“调用'FenPrincipale::connect(QPushButton*&,const char[11],moyenetmedia&,const char[8])时没有匹配的函数。”
moyenetmedia=新的moyenetmedia()是一个错误,应该是
moyenetmedia=新的moyenetmedia
您必须在
FenPrincipale
类声明中声明您的成员,如下所示:
moyenetmedia*moyenetmedia添加此
类MoyenEtMedian
FenPrincipale
类声明(.h文件)之前。我这样做了,我得到了新的错误:“从'moyenetmedia*'转换为非标量类型'moyenetmedia'请求”和“调用'FenPrincipale::connect(QPushButton*&,const char[11],moyenetmedia&,const char[8])没有匹配的函数”
moyenetmedia=新的moyenetmedia()是一个错误,应该是
moyenetmedia=新的moyenetmedia
您必须在
FenPrincipale
类声明中声明您的成员,如下所示:
moyenetmedia*moyenetmedia添加此
类MoyenEtMedian
FenPrincipale
类声明(.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
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()));
}