Qt信号和插槽-没有呼叫的匹配功能
我正在学习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
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宏。然后重新生成所有。。。