Qt:当QPointer被改变时发出信号



我想创建一个类似于QPointer的类(或子类),每当内部指针发生变化时,它都会发出信号。

不幸的是,我需要继承QObject类才能发出信号,而且我认为我需要使用模板来存储特定类型的指针。但是根据这个问题,不可能将QObject与模板混合使用。

知道如何制作跟踪内部指针更改的类吗?

当你想要保护一个QObject子类实例时,你应该使用 QPointer。如果引用的指针被删除,QPointer 将设置为0

QLabel * label = new QLabel();
QPointer pointer = label;
delete label;
if(pointer) //false
{
//...

由于持有的对象是 QObject 子类,因此您可以将插槽连接到其destroyed信号,以跟踪它何时被删除(并且 QPointer 设置为零)。

如果重新分配QPointer,则不会发出任何被破坏的信号

pointer = new QLabel();

以前保留的对象仅保持无人保护,但不会删除。

要跟踪指针重置,最好使用 QSharedPointer。 当QSharedPointer持有对象被清除或重置,并且内部引用计数变为零时,delete被调用到持有的对象(如果它是 QObject 子类,则会发出被销毁的信号)。

如果你想要一个DIY智能指针,我建议使用QObject派生类来发射信号,并在你的指针类中拥有一个实例:

class Emitter : public QObject
{
Q_OBJECT
public:
Emitter() : QObject(0) {}
void forward(void * p) { emit reset(p); }
signals:
void reset(void *);
};
template <typename T>
class Pointer
{
public:
Pointer() : instance(0){}
void connect(QObject * receiver, const char * slot)
{
QObject::connect(&emitter, SIGNAL(reset(void*)), receiver, slot);
}
void set(T* t)
{
emitter.forward(instance);
instance = t;
}
//...
private:
Emitter emitter;
T * instance;
};

显然,上面的代码不是作为智能指针实现,只是一个演示如何从类模板发出信号的示例。

要连接插槽(例如从窗体类):

Pointer<QLabel> p;
p.connect(this, SLOT(pointerreset(void*)));

传递到插槽的空指针是复位前持有的 T 指针。为了简化不可避免的强制转换,可以向 Pointer 类添加一个帮助程序方法,如下所示:

T * cast(void * p) { return static_cast<T*>(p); }

这样,对于Pointer<QLabel> pointer,在插槽中:

void Form::pointerreset(void * p)
{
QLabel * label = pointer.cast(p);
//...
}

根据您的智能指针实现,您可以考虑根本不使用旧指针,而只是发出没有参数的信号。也许没有理由进一步访问旧对象,尤其是在它即将被删除的情况下。

相关内容

  • 没有找到相关文章

最新更新