我正在学习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);
}
请协助我让信号和插槽工作,我已经花了好几个小时,但我没有接近它的工作。我添加了上述评论中收到的错误。
此致
答案 0 :(得分:1)
第一个错误是由&fi->okButton
引起的,因为->
的优先级高于&
。见Operator Precedence。使用(&fi)->okButton
轻松修复。
第二个错误可能是由一个或两个对象未继承自QObject
引起的。信号和广告位只能在QObjects
之间有效。只是一个快速清单:
QObject
类Q_OBJECT
宏此外,如果您使用的是Qt 5.0或更高版本,则应该开始将函数指针传递给connect方法,而不是使用SIGNAL
和SLOT
宏。它将提供连接的编译时检查。
答案 1 :(得分:1)
okButton已经是一个指针,那么你应该删除&符号:
QObject::connect(fi.okButton, SIGNAL(clicked()), &fi, SLOT(okButtonClicked()));
(实际上,请务必在FilmInput的构造函数中创建按钮...)
接下来,你的方法签名与你在连接中所说的不一致:给定你的函数,应该是
Object::connect(&fi, SIGNAL(obtainFilmData(Film*)), &fw, SLOT(saveFilmData(Film*)));
这将起作用,因为你正在交换指针,然后Qt可以复制它。否则,您的类型应该注册。