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();

    }

这是我对信号和插槽的悲伤尝试:

电影输入.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);

}

请帮助我让信号和插槽工作,我已经花了几个小时,但离让它工作还差得远。我在上面的评论中添加了收到的错误。

问候

4

2 回答 2

1

第一个错误是&fi->okButton由于->具有比 更高的优先级引起的&。请参阅运算符优先级。轻松修复(&fi)->okButton

第二个错误可能是由一个或两个对象不继承自QObject. 信号和插槽只能在QObjects. 只是一个快速清单:

  1. 发送者和接收者都必须从QObject类继承
  2. Q_OBJECT宏必须在每个类的定义中使用
  3. 您必须生成适当的元对象代码并将其编译到您的项目中。请参阅元对象编译器

此外,如果您使用的是 Qt 5.0 或更高版本,您应该开始将函数指针传递给连接方法,而不是使用SIGNALandSLOT宏。它将提供连接的编译时检查。

于 2013-08-17T04:39:27.220 回答
1

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

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

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

接下来,您的方法签名与您在 connect 中所说的不匹配:给定您的功能,应该是

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

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

于 2013-08-17T04:51:20.470 回答