gpt4 book ai didi

c++ - 使用 Qt 信号和槽传递指针

转载 作者:行者123 更新时间:2023-11-28 01:19:26 27 4
gpt4 key购买 nike

所以我有以下功能:

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"));

有谁知道如何以更优雅的方式做到这一点?

最佳答案

我这样做的方式需要更改您的 allDownloadsFinished 信号的签名以传递 Post:

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

signals:
void allDownloadsFinished(Post* post);

};

或者向 downloadManager 添加一个新信号,以便能够发送 Post*。在任何情况下,您都必须注册 Post 元类型:

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

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

关于c++ - 使用 Qt 信号和槽传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57201771/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com