c++ - 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 });
编辑: - 我还考虑了可能会干扰数据生命周期的跨线程信号。
解决方案
解决方案
我将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)
推荐阅读
- laravel - 在 Laravel 5.8 中返回响应之前处理数据中的关系
- java - 尾递归与非尾递归
- sql - 通过创建脚本的最后修改日期文件系统
- java - Java Swing:JTextArea 填充整个分配的空间
- c# - 如何使用串口转换器连接支付设备?(支付设备:Spire Payments SPc5)
- google-authentication - 赛普拉斯为 Google Authenticator 生成过时的代码
- ios - 如何在swiftUI中执行弹簧动画?
- webots - 锁定后如何连接连接器
- python - 在烧瓶应用程序中绘图以测量实时数据
- spring - 有没有办法在 TestExecutionListener 中获取对 Spring 应用程序上下文的引用?