将信号和插槽附加到QSharedPointer中的对象

bde*_*ham 8 c++ qt qsharedpointer

我的应用程序包含几个这样的函数:

void SomeClass::set_data_provider(DataProvider *data_provider)
{
    connect(data_provider, SIGNAL(data_available(int)),
        this, SLOT(data_available(int)));
}
Run Code Online (Sandbox Code Playgroud)

为了避免传递原始指针,我已将所有出现的更改DataProvider *QSharedPointer<DataProvider>.后者几乎是前者的直接替代,除了你不能传递QSharedPointer QObject::connect.我通过从QSharedPointer中提取原始指针来解决这个问题:

void SomeClass::set_data_provider(QSharedPointer<DataProvider> data_provider)
{
    connect(data_provider.data(), SIGNAL(data_available(int)),
        this, SLOT(data_available(int)));
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但它看起来不优雅,我担心像这样访问原始指针.有没有更好的方法连接到在QSharedPointer中传递的对象?

han*_*ank 4

您可以创建自定义连接函数:

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);
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

QSharedPointer<MyObject> shared(new MyObject);
my_connect(shared, SIGNAL(my_signal()), this, SLOT(my_slot()));
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,在您和我的解决方案中,您将失去本机连接功能的 Qt Creator 自动完成功能。

PS 至于我,我不会改变你的代码。我觉得还好:)