2013-08-17 47 views
4

我正在学习QT,并试图让我的信号和插槽工作。我没有运气。 这是我的主要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); 

} 

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

问候

回答

1

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

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

(实际上,要确保你创建FilmInput的构造函数的按钮......)

接下来,你的方法签名不符合您在连接所说:鉴于你的功能,应该是

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

这会工作,因为你交换指针,然后Qt可以做一个复制o f it。否则,你的类型应该被注册。

+0

仍然有错误。 .. \ 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:note:candidates are:static 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:note:bool QObject :: connect(const QObject *,const char *,const char *,Qt :: ConnectionType)const – user2691192

+0

嗨,我无法在上面的注释中输入更多内容,但想要说我试过你的解决方案,它并没有改变错误信息。谢谢 – 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宏。它将提供编译时检查连接。

+0

嗨塞斯, 谢谢,点1已经解决了这个问题。 我确实已经定义了Q_OBJECT,并且仍然出现错误,如果我完全错误地完成了信号和插槽,我不会感到惊讶,您确定它们看起来不错吗? 我将在核心功能正常工作后立即添加元对象。 – user2691192

+0

信号和插槽(以及许多其他Qt便利)在没有编译到项目中的那些类的元对象信息时无法运行。如果您使用的Qt Creator完全适合您,但在大多数其他环境中,您必须自己生成它。如果您还没有,请按照[本页](http://qt-project.org/doc/qt-5.1/qtdoc/moc.html)上的指示进行操作。 –