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如果它有效,请接受这一回答。