C++ Qt-发出信号时的返回值?
如何使函数仅在发出信号时返回值 下载完成后,FileDownloader类会发出“downloaded()”信号。我想在发出downloaded()信号后返回下载的数据C++ Qt-发出信号时的返回值?,c++,qt,C++,Qt,如何使函数仅在发出信号时返回值 下载完成后,FileDownloader类会发出“downloaded()”信号。我想在发出downloaded()信号后返回下载的数据 QImage ImgDownloader::downloadIMG(QUrl url){ fd = new FileDownloader(url, this); //???? return QImage::fromData(fd->downloadedData()); } 编辑:为了澄清问题,do
QImage ImgDownloader::downloadIMG(QUrl url){
fd = new FileDownloader(url, this);
//????
return QImage::fromData(fd->downloadedData());
}
编辑:为了澄清问题,downloadmg()函数不是插槽或信号
FileDownloader包含以下来自()的插槽和信号
我想要实现的是创建一个函数,从QUrl返回一个QImage[QImage func(QUrl)]。但是,我希望在返回值之前确保数据已下载。(使用下载的()信号?您似乎很困惑。即使Qt中的信号确实可以返回值,但这很少被使用,如果有的话。也就是说,这没有多大意义 您可能不想返回图像,而是发出带有信号的图像,通过这种方式,您可以将图像连接到一个函数,该函数将接收图像并对其进行处理 在这种情况下,您希望将信号声明为:
void downloaded(QImage img);
并通过以下方式发出:
emit downloaded(Image::fromData(fd->downloadedData()));
或者只是:
downloaded(Image::fromData(fd->downloadedData()));
asemit
只是为了可读性而进行的装饰,它什么都不做
我想要实现的是创建一个返回QImage的函数
从一个QUrl[QImage func(QUrl)]。然而,我想确保
返回值之前已下载数据
发生这种情况的唯一方法是使用阻塞API,但不建议在主/GUI线程中这样做,因为您的应用程序似乎对操作系统没有响应。如果您想在GUI中使用该图像,则必须在另一个线程中执行该操作,并将最终结果传递给主线程。无论如何,您仍然必须使用上面的信号声明来发送到图像,以便将其发送到图像。当您连接到主线程时,Qt将检测到这两个对象在不同的线程中运行,并为您使用排队连接
或者,您可以执行一个非阻塞实现,在主线程中定期运行,而不阻塞它
但在一个函数中从URL获取图像的唯一方法是通过数据下载阻止该函数。
emit
用于信号,而不是插槽。的确,通常它只是一个空宏,信号是您的代码调用的实际方法。当插槽属于其他线程时,信号可以直接调用插槽,也可以使用间接异步调用
您计划的此类插槽不能以异步方式安全地调用。您可以通过自定义信号通过对插槽的引用传递参数,但如果异步调用,则必须进行同步。其中一种方法是使用future类:QFuture
或std::future
(QFuture
在您的情况下可能更可取)。这样,调用线程将知道被调用方何时完成下载。结果只需返回下载状态(错误代码或缺少)
您的插槽可能与调用者在同一个线程中实现,但进程将是一个单独的QThread,它将从插槽运行并更新状态。在何处返回它?我希望函数从文件下载器返回一个QImage。如果
downloadIMG
是插槽,则代码没有任何意义。您必须使用emit将数据发送到所需的位置。emit用于信号,而不是插槽。它只在插槽的同步调用中起作用。。我想,这样的函数不能以异步方式安全地调用。如果不知道结果何时出现,则必须使用类似于future
object@Swift-OP的主题非常明确:发出一个“下载的()”信号
。不知道你是从哪里想到插槽的…@gxexx,QNetworkReply
已经发出了finished
信号,当回复完成处理时。
downloaded(Image::fromData(fd->downloadedData()));