私は他の同様の質問をチェックし、それらの解決策を試しましたが、それらは私にはうまくいきません。
基本的には、投稿要求のみを行う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 *)」
何か案が?
おそらく Q_OBJECT
マクロ。独自のスロット/シグナルを実装するすべてのクラスには、そのマクロが必要です。 .proファイルにヘッダー/ソースファイルを追加する必要があることを忘れないでください。
注意すべき点が1つあります。 Qt 5を使用しているため、新しいシグナルスロット接続構文があり、スロットとして定義された機能だけでなく、任意の機能を指定できます。
この状況では、これを行うことができます:-
connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);
この構文の優れている点は、関数のアドレスを指定するだけで、パラメーターに煩わされないため、関数でパラメーターを変更しても、connectステートメントでパラメーターを更新する必要がないことです。
それでもQ_OBJECTマクロを使用する必要があり、新しい構文 here の詳細を確認できます。
この投稿はグーグル検索の一番上にあるので、ここで別の考えられる問題を共有します。
QObject
を追加することに加えて、カスタマイズしたイベントにpublic slots:
またはpublic Q_SLOTS:
も追加する必要があります。そうしないと、QObject::connect: No such slot
エラーが引き続き発生します。
Zetaの投稿 および 他の投稿 に従って、ここに簡単な要約を示します。
“No such slot” error
を解決するには、確認する必要があります。
- クラスが
QObject
またはQObjectから派生したクラスを継承しているかどうかを確認します- クラス定義内に
QObject
マクロを追加します- イベントのprivate/protected/publicキーワードの後に
slots
またはQ_SLOTS
を追加します- 1-3をチェックする場合、clean、run qmake、そして、再構築して、1〜3のすべてのものが moc によって生成されることを確認します。
最後に、ここに例を示します。
class MyClass: public QObject { //check 1
Q_OBJECT //check 2
public slots: //check 3
void onEvent(int);
};
これが他人の命を救うことを願って