【问题标题】:Member function as a Qt Slot作为 Qt Slot 的成员函数
【发布时间】:2012-12-10 16:43:58
【问题描述】:

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

 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 设计器创建):

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()));

我已经在 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

【问题讨论】:

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

标签: qt function connect member slot


【解决方案1】:

在 Qt 5.0 之前,连接的目的地必须在类声明中声明为 SLOT。

Qt 5.0 引入了一些新的连接语法。其中之一允许您将信号连接到任何成员函数: http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#connect-4

【讨论】:

    【解决方案2】:

    您需要在这里创建一个对象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 是一个类而不是一个对象。

    【讨论】:

    • 我这样做了,但出现了新错误:“请求从 'MoyenEtMedian*' 转换为非标量类型 'MoyenEtMedian'”和“没有匹配函数调用 'FenPrincipale::connect(QPushButton *&, const char [11], MoyenEtMedian&, const char [8])'"
    • moyenEtMedian = new MoyenEtMedian(); 是一个错误,应该是moyenEtMedian = new MoyenEtMedian; stackoverflow.com/questions/180172/…
    • 您必须在FenPrincipale 类声明中声明您的成员,如下所示:MoyenEtMedian *moyenEtMedian;
    • FenPrincipale 类声明(.h 文件)之前添加这个class MoyenEtMedian;
    猜你喜欢
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多