Qt5 - Как передать указатель QList <T>* в качестве параметра сигнала и удалить его по завершении? - PullRequest
0 голосов
/ 26 мая 2020

Я хотел бы передать QList в качестве параметра сигнала в Qt5.

Следующий код предлагает эту идею, но проблема заключается в объекте 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 и правильно удалить его, когда сигнал был обработан всеми слотами?

EDIT:

Учитывая обсуждение в комментарии к предложению использовать shared_ptr, я сделал следующее, что привело к ошибке сегментации. Так что мне нужно еще немного углубиться в shared_ptr.

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

EDIT: - Я также рассматриваю межпотоковую сигнализацию, которая может повлиять на время жизни данных.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Решение

Я бы использовал const QList<t> &list в качестве аргумента сигнала вместо указателя. Таким образом, нет необходимости ни создавать новый объект, ни удалять его.

Пример

Рассмотрим следующий пример, который я подготовил для вас, чтобы продемонстрировать этот подход:

основной. cpp

#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);
};

boo.h

#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;
    }
};

moo.h

#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)
0 голосов
/ 26 мая 2020

Возможно, вам следует передать shared_ptr вместо необработанного указателя.

...