【问题标题】:Pass a pointer using Qt signals and slots使用 Qt 信号和槽传递指针
【发布时间】: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&lt;DownloadManager *, Post *&gt; m_map;作为类成员。

标签: c++ qt signals-slots


【解决方案1】:

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

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

signals:
   void allDownloadsFinished(Post* post);

};

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

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

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

【讨论】:

  • 真的需要qRegisterMetaType吗?
  • 我想是的。但是你可以试试没有。我一般把它放在要发送的类的构造函数中。
  • 另一个问题,在downloadManager 发出信号时,您如何“创建”要发出的Post*?它是在课堂内动态创建的吗?
  • 你必须这样做 emit allDownloadsFinished(post) 就是这样。
  • @daljit97 如果它有效,请接受这个作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多