Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-发出信号时的返回值?_C++_Qt - Fatal编程技术网

C++ Qt-发出信号时的返回值?

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

如何使函数仅在发出信号时返回值

下载完成后,FileDownloader类会发出“downloaded()”信号。我想在发出downloaded()信号后返回下载的数据

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()));
as
emit
只是为了可读性而进行的装饰,它什么都不做

我想要实现的是创建一个返回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()));