我的应用程序包含几个这样的函数:
void SomeClass::set_data_provider(DataProvider *data_provider) { connect(data_provider,SIGNAL(data_available(int)),this,SLOT(data_available(int))); }
为了避免传递原始指针,我已将所有出现的DataProvider *更改为QSharedPointer< DataProvider>.后者几乎是前者的替代品,除了你不能将QSharedPointer传递给QObject :: connect.我通过从QSharedPointer中提取原始指针来解决这个问题:
void SomeClass::set_data_provider(QSharedPointer<DataProvider> data_provider) { connect(data_provider.data(),SLOT(data_available(int))); }
这似乎工作正常,但它看起来不够优雅,我担心像这样访问原始指针.有没有更好的方法连接到在QSharedPointer中传递的对象?
解决方法
您可以创建自定义连接功能:
template<class T> bool my_connect(const QSharedPointer<T> &sender,const char *signal,const QObject *receiver,const char *method,Qt::ConnectionType type = Qt::AutoConnection) { return QObject::connect(sender.data(),signal,receiver,method,type); }
并像这样使用它:
QSharedPointer<MyObject> shared(new MyObject); my_connect(shared,SIGNAL(my_signal()),SLOT(my_slot()));
唯一的问题是,在您和我的解决方案中,您将失去本机连接功能的Qt Creator自动完成功能.
附:至于我,我不会改变你的代码.我觉得很好:)