【发布时间】:2019-07-25 12:16:05
【问题描述】:
所以我有以下功能:
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);
}
现在我想在我的MediaFetcher::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();
}
我认为非常丑陋的一个解决方案(我也认为它会导致内存泄漏)是使用QObject::setProperty,然后将我的Post* 添加到downloadManager,然后将其放入插槽中(我曾经使用过qvariant_cast)。在parseData()
QVariant postVariant = QVariant::fromValue(post);
downloadManager->setProperty("post", postVariant);
然后在onFilesDownloaded():
Post* post = qvariant_cast<Post*>(downloadManager->property("post"));
有谁知道如何以更优雅的方式做到这一点?
【问题讨论】:
-
如果将
Post* post设为MediaFetcher类的成员变量会怎样? -
为什么不通过信号向槽发送
Post对象(或常量引用)? -
@vahancho 问题是如果用户再次调用
parseData(),那么Post*可能会在下载完成之前设置(因此将添加最后一个Post*)。 -
@daljit97,但下载管理器也会发生同样的情况,不是吗?
-
@daljit97,另一种选择是将
Post封装在DownloadManager中,或者存储Post和对应的下载管理器之间的映射:std::map<DownloadManager *, Post *> m_map;作为类成员。
标签: c++ qt signals-slots