C++ 使用Qt信号和插槽传递指针

C++ 使用Qt信号和插槽传递指针,c++,qt,signals-slots,C++,Qt,Signals Slots,所以我有以下功能: void parseData() { // DownloadManager and Post subclass QObject DownloadManager* downloadManager = new DownloadManager(); Post* post = new Post(mPostsModel); // using qt signal and slots I would like to retrieve the Post in

所以我有以下功能:

void parseData()
{
    // DownloadManager and Post subclass QObject
    DownloadManager* downloadManager = new DownloadManager();
    Post* post = new Post(mPostsModel);

    // using qt signal and slots I would like to retrieve the Post in the onFileDownloaded slot
    connect(downloadManager, &DownloadManager::allDownloadsFinished, this, &MediaFetcher::onFileDownloaded);

}
现在我想进入我的
mediaftcher::onFileDownloaded
槽中的
Post*Post
,如下所示:

void MediaFetcher::onFileDownloaded()
{
    qDebug() << "files downloaded";
    DownloadManager* downloadManager = qobject_cast<DownloadManager*>(sender());
    Post* post = getPost(); // how do I get this???
    mPostsModel->append(post);

    downloadManager->deleteLater();
}
然后在
onFileDownloaded()
中:

Post*Post=qvariant_cast(下载管理器->属性(“Post”);

有人知道如何以更优雅的方式完成吗?

我这样做需要更改
所有下载的签名完成
信号以传递
Post

class downloadManager : public QWidget
{
// Normal constructors and destructor and macros

signals:
   void allDownloadsFinished(Post* post);

};
或者向下载管理器添加新信号,以便能够发送
Post*
。在任何情况下,您都必须注册
Post
元类型:

qRegisterMetaType<Post*>("Post*");
qRegisterMetaType(“Post*”);

显然,这需要您的插槽接受
Post*
类型。

我这样做需要更改
所有下载的签名完成
信号以传递
Post

class downloadManager : public QWidget
{
// Normal constructors and destructor and macros

signals:
   void allDownloadsFinished(Post* post);

};
或者向下载管理器添加新信号,以便能够发送
Post*
。在任何情况下,您都必须注册
Post
元类型:

qRegisterMetaType<Post*>("Post*");
qRegisterMetaType(“Post*”);


显然,这需要您的插槽接受
Post*
类型。

如果将
Post*Post
设置为
mediaftcher
class”成员变量,该怎么办?为什么不通过信号将
Post
对象(或const ref)发送到插槽?@vahancho问题是,如果用户下次调用
parseData()
,然后,
Post*
可能会在下载完成之前设置好(因此会添加最后一个
Post*
。@daljit97,但下载管理器也会发生同样的情况,不是吗?@daljit97,另一个选项是在
DownloadManager
中压缩
Post
,或者存储Post和相应下载管理器之间的映射:
std::map m\u map
作为类成员。如果将
Post*Post
作为
MediaFetcher
class”成员变量,该怎么办?为什么不通过信号将
Post
对象(或const ref)发送到插槽?@vahancho问题是,如果用户再次调用
parseData()
,然后,
Post*
可能会在下载完成之前设置好(因此会添加最后一个
Post*
。@daljit97,但下载管理器也会发生同样的情况,不是吗?@daljit97,另一个选项是在
DownloadManager
中压缩
Post
,或者存储Post和相应下载管理器之间的映射:
std::map m\u map
作为一个类成员。真的需要
qRegisterMetaType
吗?我想是的。但是你可以不试一下。我通常把它放在要发送的类的构造函数中。另一个问题是,在
downloadManager
中,如何“创建”要发送的
Post*
?它是在类内部动态创建的吗?您必须执行
发出所有下载完成(post)
,就这样。@daljit97如果它有效,请接受这个作为答案。
qRegisterMetaType
真的需要吗?我想是的。但是你可以不试一下。我通常把它放在要发送的类的构造函数中。另一个问题是,在
downloadManager
中,如何“创建”要发送的
Post*
?它是在类内部动态创建的吗?您必须执行
发出所有下载完成(post)
,就这样。@daljit97如果它有效,请接受这一回答。