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

}

シグナルとスロットを機能させるために私を助けてください。私は何時間も費やしましたが、それを機能させることに近づいていません. 上記のコメントで受け取ったエラーを追加しました。

よろしく

4

2 に答える 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 はそのコピーを作成できます。それ以外の場合は、タイプを登録する必要があります。

于 2013-08-17T04:51:20.470 に答える
1

最初のエラーは、 よりも優先順位が高い&fi->okButtonためです。演算子の優先順位を参照してください。で簡単固定。->&(&fi)->okButton

2 番目のエラーは、1 つまたは両方のオブジェクトが から継承されていないことが原因である可能性がありますQObject。信号とスロットは の間でのみ機能しQObjectsます。簡単なチェックリスト:

  1. 送信者と受信者の両方がQObjectクラスから継承する必要があります
  2. マクロは、各クラスの定義で使用するQ_OBJECT必要があります
  3. 適切なメタオブジェクト コードを生成し、それをプロジェクトにコンパイルする必要があります。メタオブジェクト コンパイラを参照してください

SIGNALまた、Qt バージョン 5.0 以降を使用している場合は、およびSLOTマクロを使用する代わりに、関数ポインターを connect メソッドに渡し始める必要があります。接続のコンパイル時のチェックを提供します。

于 2013-08-17T04:39:27.220 に答える