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

时间:2013-08-17 03:49:52

标签: 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( 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);

}

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

此致

2 个答案:

答案 0 :(得分:1)

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

第二个错误可能是由一个或两个对象未继承自QObject引起的。信号和广告位只能在QObjects之间有效。只是一个快速清单:

  1. 发件人和收件人都必须继承QObject
  2. 必须在每个类的定义中使用Q_OBJECT
  3. 您必须生成适当的元对象代码并将其编译到项目中。请参阅Meta-Object Compiler
  4. 此外,如果您使用的是Qt 5.0或更高版本,则应该开始将函数指针传递给connect方法,而不是使用SIGNALSLOT宏。它将提供连接的编译时检查。

答案 1 :(得分:1)

okButton已经是一个指针,那么你应该删除&符号:

QObject::connect(fi.okButton, SIGNAL(clicked()), &fi, SLOT(okButtonClicked()));

(实际上,请务必在FilmInput的构造函数中创建按钮...)

接下来,你的方法签名与你在连接中所说的不一致:给定你的函数,应该是

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

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