给出一个简单的课程 有一个私人成员,例如
double *data_series
这个成员被分配并填充qt插槽中的数据,如下所示:
int channel_count = ...
data = new double[channel_count];
std::copy(input_data, input_data+channel_count, data);
在这个类的dtor中删除了数据ptr。
现在,这个简单的类包含检索的小数据样本,并且每个类/帧都被发出,然后应该以一种好的方式由所有连接的槽处理,请注意数据ptr指向的数据是从未修改过,只需阅读。
我不太擅长智能指针,所以首先我只有一个插槽连接,所以不是一个大问题,我可以发出指向类的指针,并在完成后删除插槽中的类。当连接多个插槽时出现问题,只有当所有插槽都完成数据时才应删除数据指针。我不能按值发出类,因为我不想让复制文件一直复制数据。
那么,我应该发出某种类型的智能指针吗?或者我应该以某种方式使用智能指针管理数据指针。我正在寻找一个好的模式让我跟随。
brgds
答案 0 :(得分:0)
将QSharedPointer与自定义删除器一起使用。如果将其用作signal / slot参数,请在连接signal / slots之前调用qRegisterMetatype。
以下是删除器使用的示例 example
答案 1 :(得分:0)
由于您使用C ++编程,因此您应该使用容器。然后,这将为您处理所有讨厌的细节,并且只是工作。
class Class : public QObject {
Data m_data;
...
public:
typedef QVector<double> Data;
// The signal and slot declarations MUST use fully qualified types!
Q_SIGNAL void hasData(const Class::Data &);
...
Q_SLOT void processData() {
Data localData(m_data);
...
// you can modify localData here
...
emit hasData(localData);
...
}
}
Q_DECLARE_METATYPE(Class::Data)
int main(int argc, char ** argv)
{
...
qRegisterMetatype<Class::Data>();
...
}
重要的是要意识到moc将类型视为字符串,因此您必须声明和使用完全限定类型。