web-dev-qa-db-ja.com

QObject接続関数

私は他の同様の質問をチェックし、それらの解決策を試しましたが、それらは私にはうまくいきません。

基本的には、投稿要求のみを行うHTTPクライアントを作成しようとしています。これを行うには、QNetworkManagerの終了信号をコールバックスロットに接続する必要があります。

これが私のコードです。

hファイル

...
public slots:
   void finishedSlot(QNetworkReply* reply);
private:
    QNetworkAccessManager *network_manager;
...

cppファイル

...
Class1::Class1(){
    network_manager = new QNetworkAccessManager(this);
    QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *)));
}
...
void Class1::finishedSlot(QNetworkReply* reply)
{
    // some logic with reply
}
...

ご覧のとおり、スロットは間違いなく存在し、ヘッダーファイルのパブリックスロットの下で宣言されています。だから私はこれがなぜ起こっているのか分かりません。私はすでにきれいにしようとし、qmakeを実行し、再構築しました。

エラーメッセージは次のとおりです。

「QObject :: connect:そのようなスロットはありませんQObject :: finishedSlot(QNetworkReply *)」

何か案が?

22
Charlemagne

おそらく Q_OBJECT マクロ。独自のスロット/シグナルを実装するすべてのクラスには、そのマクロが必要です。 .proファイルにヘッダー/ソースファイルを追加する必要があることを忘れないでください。

47
Zeta

注意すべき点が1つあります。 Qt 5を使用しているため、新しいシグナルスロット接続構文があり、スロットとして定義された機能だけでなく、任意の機能を指定できます。

この状況では、これを行うことができます:-

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);

この構文の優れている点は、関数のアドレスを指定するだけで、パラメーターに煩わされないため、関数でパラメーターを変更しても、connectステートメントでパラメーターを更新する必要がないことです。

それでもQ_OBJECTマクロを使用する必要があり、新しい構文 here の詳細を確認できます。

20
TheDarkKnight

この投稿はグーグル検索の一番上にあるので、ここで別の考えられる問題を共有します。

QObjectを追加することに加えて、カスタマイズしたイベントにpublic slots:またはpublic Q_SLOTS:も追加する必要があります。そうしないと、QObject::connect: No such slotエラーが引き続き発生します。

Zetaの投稿 および 他の投稿 に従って、ここに簡単な要約を示します。

“No such slot” errorを解決するには、確認する必要があります。

  1. クラスがQObjectまたはQObjectから派生したクラスを継承しているかどうかを確認します
  2. クラス定義内にQObjectマクロを追加します
  3. イベントのprivate/protected/publicキーワードの後に​​slotsまたはQ_SLOTSを追加します
  4. 1-3をチェックする場合、cleanrun qmake、そして、再構築して、1〜3のすべてのものが moc によって生成されることを確認します。

最後に、ここに例を示します。

class MyClass: public QObject { //check 1
     Q_OBJECT //check 2

   public slots: //check 3
     void onEvent(int);
};

これが他人の命を救うことを願って

5
AndersonMeng