Qt信号和插槽-没有呼叫的匹配功能

Qt信号和插槽-没有呼叫的匹配功能,qt,signals-slots,Qt,Signals Slots,我正在学习QT,并试图让我的信号和插槽正常工作。我运气不好。 这是我的主要任务 int main(int argc, char** argv) { QApplication app(argc, argv); FilmInput fi; FilmWriter fw; QObject::connect (&fi->okButton, SIGNAL( clicked() ), &fi, SLOT( okButtonClic

我正在学习QT,并试图让我的信号和插槽正常工作。我运气不好。 这是我的主要任务

    int main(int argc, char** argv) {
      QApplication app(argc, argv);

      FilmInput fi;
      FilmWriter fw;
      QObject::connect (&fi->okButton, SIGNAL( clicked() ), &fi, SLOT( okButtonClicked() ) 

    ); //Error received Base operand of '->' has non-pointer type 'FilmInput'
     QObject::connect(&fi,SIGNAL(obtainFilmData(QVariant*)),&fw,SLOT(saveFilmData(QVariant*)));
//Error received No matching function for call to 'QObject::connect(Filminput*, const     char*, FilmWriter*, const char*)
      fi.show();
      return app.exec();

    }
下面是我对信号和插槽的悲哀尝试:

FilmInput.h

public:
        FilmInput();
        void okButtonClicked();
    QPushButton* okButton;
signals:
        void obtainFilmData(Film *film);
Here is FilmWriter.h

public slots:
    int saveFilm(Film &f);

Here is Film Input.cpp


void FilmInput::okButtonClicked(){
    Film *aFilm=new Film();
    aFilm->setDirector(this->edtDirector->text());
    emit obtainFilmData(aFilm);

}
这里是FilmWriter.cpp

void FilmInput::okButtonClicked(){
    Film *aFilm=new Film();
    aFilm->setDirector(this->edtDirector->text());
    emit obtainFilmData(aFilm);

}
请帮助我让信号和插槽工作,我已经花了几个小时,但还没有接近让它工作。我在上面的评论中添加了收到的错误


关于

第一个错误是由
&fi->ok按钮
引起的,因为
->
的优先级高于
&
。看见使用
(&fi)->okButton
轻松修复

第二个错误可能是由于一个或两个对象未继承自
QObject
。信号和插槽只能在
QoObject
之间工作。只是一个简单的清单:

  • 发送方和接收方都必须从
    QObject
    类继承
  • 在每个类的定义中必须使用
    Q_对象
  • 您必须生成适当的元对象代码并将其编译到项目中。看

  • 此外,如果您使用的是Qt 5.0或更高版本,则应该开始向connect方法传递函数指针,而不是使用
    信号
    插槽
    宏。它将提供对连接的编译时检查。

    OK按钮已经是一个指针,那么您应该删除符号和:

    QObject::connect(fi.okButton, SIGNAL(clicked()), &fi, SLOT(okButtonClicked()));
    
    (实际上,请确保您在FilmInput的“构造函数”中创建了按钮…)

    接下来,您的方法签名与您在connect中所说的不匹配:给定您的函数,应该是

    Object::connect(&fi, SIGNAL(obtainFilmData(Film*)), &fw, SLOT(saveFilmData(Film*)));
    

    这将起作用,因为您正在交换指针,然后Qt可以复制它。否则,应注册您的类型

    嗨,赛斯,谢谢你,第一点解决了这个问题。我确实定义了Q_对象,但仍然得到错误,如果我的信号和插槽完全不正确,我不会感到惊讶,你确定它们看起来正常吗?一旦核心功能正常工作,我就会添加元对象。如果没有编译到项目中的那些类的元对象信息,信号和插槽(以及许多其他Qt便利设施)将无法正常工作。如果您使用的是Qt-Creator,这一切都可以为您完成,但在大多数其他环境中,您必须自己生成它。如果还没有,请按照上的说明操作。仍然会出现错误\Main.cpp:在函数“int qMain(int,char**)”中:…\Main.cpp:11:错误:调用“QObject::connect(FilmInput*,const char*,FilmWriter*,const char*)”时没有匹配的函数c:\Qt\2010.04\Qt\include/QtCore/。/../src/corelib/kernel/QObject.h:198:注意:候选函数是:静态bool QObject::connect(const-QObject*,const-char*,const-QObject*,const-char*,Qt::ConnectionType)c:\Qt\2010.04\Qt\include/QtCore/。/../src/corelib/kernel/QObject.h:313:注意:bool-QObject::connect(const-QObject*,const-char*,const-char*,const-char*,Qt::ConnectionType)constHi,我无法在上面的评论中键入更多内容,但我想说的是,我尝试了您的解决方案,但没有更改错误消息。谢谢您应该从QObject派生FilmInput和FilmWriter,并在标题中添加Q_OBJECT宏。然后重新生成所有。。。