Qt信号和槽 - 调用没有匹配的函数

4
我正在学习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个回答

1

okButton已经是一个指针,所以您应该去掉&符号:

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

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

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

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

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


仍然出现错误。 ..\Main.cpp: 在函数'int qMain(int, char**)中': ..\Main.cpp:11: 错误: 找不到匹配的函数以便连接'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 *,Qt :: ConnectionType)const - user2691192
嗨,我在上面的评论中无法输入更多内容,但想说我尝试了你的解决方案,但错误消息并未改变。谢谢。 - user2691192
2
你应该从QObject派生FilmInput和FilmWriter, 并在头文件中添加Q_OBJECT宏。然后进行全部重新构建... - CapelliC

1
第一个错误是由于&fi->okButton中的->&的优先级更高造成的。请参见Operator Precedence。通过使用(&fi)->okButton轻松解决。
第二个错误可能是由于一个或两个对象没有继承自QObject。信号和槽只能在QObjects之间工作。快速检查清单如下:
  1. 发送方和接收方都必须继承自QObject
  2. 在每个类的定义中必须使用Q_OBJECT
  3. 您必须生成适当的元对象代码并将其编译到您的项目中。请参见Meta-Object Compiler
此外,如果您使用Qt 5.0或更高版本,则应开始将函数指针传递给连接方法,而不是使用SIGNALSLOT宏。它将提供连接的编译时检查。

嗨 Seth,谢谢,第一点解决了那个问题。 我已经定义了Q_OBJECT,但仍然出现错误,如果我的信号和槽完全不正确,我不会感到惊讶,你确定它们看起来没问题吗? 我将在核心功能正常工作后立即添加元对象。 - user2691192
如果没有编译项目中这些类的元对象信息,信号和槽(以及许多其他Qt便利功能)将无法正常工作。如果您使用的是Qt Creator,则已经为您完成了所有操作,但在大多数其他环境中,您需要自己生成它。如果您还没有,请按照此页面上的说明进行操作。 - Seth Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接