私のクラスからシグナルfinished()
を放出しようとしました。しかし、私がスロットに信号を接続しているとき、何もしませんでした。放射されたシグナルが検出されない
私のクラスの名前はblend_install
です。blendinstaller
と宣言し、それをQEventLoopに接続しようとしました。
....
QEventLoop ac;
connect(&blendinstaller, SIGNAL(finished()), &ac, SLOT(quit()));
blendinstaller.show_progress();
blendinstaller.download(); // this will execute everything and in the end emit finished()
ac.exec();
....
download()
機能:
current_prog = BLEND_INSTALL_NONE;
emit progress_changed(current_prog);
manager = new QNetworkAccessManager;
file_handler = new QFile(downloadTo);
file_handler->open(QFile::WriteOnly);
.... handle error .... // each of this (error handling) will emit finished() signal and return;
.... // each of this will represent the process of reporting event changes (for logging), emit a SIGNAL()
QNetworkRequest request;
request.setUrl(QUrl(downloadFrom));
reply = manager->get(request);
event = new QEventLoop;
connect(reply,SIGNAL(finished()),event,SLOT(quit()));
connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(downloadError(QNetworkReply::NetworkError)));
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadProgressL(qint64,qint64)));
event->exec();
.... handle error ....
.... write reply.readAll() to file ....
....
// these are instruction for a custom QProcess instance
proc.setProgram(extractWith);
proc.setArguments(ar);
proc.setWorkingDirectory(downloadIn);
event = new QEventLoop;
connect(&proc,SIGNAL(finished(int)),event,SLOT(quit()));
connect(&proc,SIGNAL(error(QProcess::ProcessError)),this,SLOT(extractError(QProcess::ProcessError)));
connect(&proc,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(extractFinished(int,QProcess::ExitStatus)));
proc.start();
proc.open_console();
event->exec();
.... handle error ....
....
.... attempt to find output of QProcess (extract an archive) ....
.... handle error, output of QProcess not found ....
....
emit installed(installOn);
emit finished(); // the SIGNAL I want to get.
qDebug("It's finished installing!");
したがって、TL; DRは取り扱いエラーの各々は、関数からの戻りもfinished()
を放出し、関数の最後に(エラーがないと仮定します)それはfinished()
を放出するでしょう。
ループを終了しません。
それは罰金に見えるん:
ここで更新#2 はもちろん、完璧ではない小さな例、です。 'download()'実装を投稿できますか?あなたの 'download()'メソッドが 'finished()'シグナルをあまりにも早く放出することは想像できません。より良いと言った:それは全くそれから呼び出されるべきではない。通常、ある種のプライベートスロット 'onDownloadComplete()'は 'finished()'シグナルを出力します。 – mfreiholz
@mfreiholz私はそれをアップロードしました。私はあなたの提案を試してみるでしょう... –
"それはインストールが完了しました!"しかし、まだ 'finished()'シグナルは出ません。 –