首页 > 解决方案 > Qt5 - 如何传递`QList*` 指针作为信号参数并在完成时将其删除?

问题描述

我想在 Qt5 中将 QList 作为信号参数传递。

下面的代码暗示了这个想法,但问题在于 QList 对象应该在信号发送到所有侦听器后被删除。

class SomeClass {
    Q_OBJECT
public:
Q_SIGNALS:
    void dataReceived(QList<T> *list);
private:
    void someFunction(void);
}

void SomeClass::someFunction(void) {
    QList<T> *list=new QList<T>();
    /* ... fill list*/
    emit dataReceived(list);
}

QList当信号已被所有插槽处理时,我应该如何执行此操作以传递并正确删除它?

编辑:

鉴于对使用“shared_ptr”的建议的评论中的讨论,我做了以下导致分段错误的操作。所以我需要深入研究 shared_ptr 。

    std::shared_ptr<QList<T>> list;
    /* segmentation fault on next line */
    list.get()->append({ item });

编辑: - 我还考虑了可能会干扰数据生命周期的跨线程信号。

标签: c++qt5signalsdelete-operator

解决方案


解决方案

我将const QList<t> &list用作信号参数,而不是指针。这样就不需要创建新对象,也不需要删除它。

例子

考虑以下我为您准备的示例,以演示此方法:

主文件

#include <QCoreApplication>
#include "foo.h"
#include "moo.h"
#include "boo.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Foo foo;
    Boo boo;
    Moo moo;

    QObject::connect(&foo, &Foo::dataReady, &boo, &Boo::boo);
    QObject::connect(&foo, &Foo::dataReady, &moo, &Moo::moo);

    foo.foo();

    return a.exec();
}

foo.h

#include <QObject>

class Foo: public QObject {
    Q_OBJECT
public:
    explicit Foo(QObject *parent = nullptr): QObject(parent) {

    }

    void foo() {
        QList<int> list;

        list.append(77);
        list.append(13);
        list.append(10);

        emit dataReady(list);
    }

signals:
    void dataReady(const QList<int> &list);
};

#include <QObject>
#include <QDebug>

class Boo: public QObject {
    Q_OBJECT
public:
    explicit Boo(QObject *parent = nullptr): QObject(parent) {
    }

public slots:
    void boo(const QList<int> &list) {
        qDebug() << "from boo: " << list;
    }
};

哞哞

#include <QObject>
#include <QDebug>

class Moo: public QObject {
    Q_OBJECT
public:
    explicit Moo(QObject *parent = nullptr): QObject(parent) {
    }

public slots:
    void moo(const QList<int> &list) {
        qDebug() << "from moo: " << list;
    }
};

结果

该示例的执行产生以下结果:

from boo:  (77, 13, 10)
from moo:  (77, 13, 10)

推荐阅读